]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/blobdiff - lib/LaTeX/TikZ/Scope.pm
Remove string overloading completely for scope objects
[perl/modules/LaTeX-TikZ.git] / lib / LaTeX / TikZ / Scope.pm
index 05308ddb07a067041770ff797aad66eedc28815b..c07225962824d95eb027c538d991c3e09b18c79d 100644 (file)
@@ -76,7 +76,7 @@ sub body {
 }
 
 use overload (
- '.' => \&concat,
+ '@{}' => 'dereference',
 );
 
 sub flatten {
@@ -163,45 +163,54 @@ sub instantiate {
  return @body;
 }
 
-sub concat {
- my ($left, $right, $rev) = @_;
-
- $_body_tc->assert_valid($right);
+sub dereference { [ $_[0]->instantiate ] }
 
- $left = $left->flatten;
+sub fold {
+ my ($left, $right, $rev) = @_;
 
  my (@left, @right);
 
- if ($my_tc->check($right)) {
-  $right = $right->flatten;
-
-  my ($only_left, $common, $only_right) = $inter->(
-   $left->_mods_cache,
-   $right->_mods_cache,
-  );
-
-  if (@$common) {
-   my $x = $left->new
-                ->mod(@$only_left)
-                ->body($left->_body);
-   my $y = $left->new
-                ->mod(@$only_right)
-                ->body($right->_body);
-   ($x, $y) = ($y, $x) if $rev;
-   return $left->new
-               ->mod(@$common)
-               ->body($x . $y);
+ if ($my_tc->check($left)) {
+  $left = $left->flatten;
+
+  if ($my_tc->check($right)) {
+   $right = $right->flatten;
+
+   my ($only_left, $common, $only_right) = $inter->(
+    $left->_mods_cache,
+    $right->_mods_cache,
+   );
+
+   if (@$common) {
+    my $x = $left->new
+                 ->mod(@$only_left)
+                 ->body($left->_body);
+    my $y = $left->new
+                 ->mod(@$only_right)
+                 ->body($right->_body);
+    return $left->new
+                ->mod(@$common)
+                ->body(fold($x, $y, $rev));
+   } else {
+    @right = $right->instantiate;
+   }
   } else {
-   @right = $right->instantiate;
+   $_body_tc->assert_valid($right);
+   @right = @$right;
   }
+
+  @left = $left->instantiate;
  } else {
-  @right = @$right;
+  if ($my_tc->check($right)) {
+   return fold($right, $left, 1);
+  } else {
+   $_body_tc->assert_valid($_) for $left, $right;
+   @left  = @$left;
+   @right = @$right;
+  }
  }
 
- @left = $left->instantiate;
-
- $left->new
-      ->body($rev ? [ @right, @left ] : [ @left, @right ]);
+ $rev ? [ @right, @left ] : [ @left, @right ];
 }
 
 __PACKAGE__->meta->make_immutable;