]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/blobdiff - lib/LaTeX/TikZ/Formatter.pm
Remove magic LaTeX::TikZ::Interface->import
[perl/modules/LaTeX-TikZ.git] / lib / LaTeX / TikZ / Formatter.pm
index 18abe13ef5ec872547aed19fd8f39de70f255db5..aa26ebc91766ba511e8fc9ac1ea1d9b766107b0b 100644 (file)
@@ -17,6 +17,8 @@ our $VERSION = '0.01';
 
 use Sub::Name ();
 
+use LaTeX::TikZ::Interface;
+
 use LaTeX::TikZ::Tools;
 
 use Any::Moose;
@@ -51,33 +53,56 @@ has 'height' => (
 );
 
 has 'origin' => (
- is   => 'ro',
- does => 'Maybe[LaTeX::TikZ::Point]',
+ is     => 'ro',
+ isa    => 'Maybe[LaTeX::TikZ::Point::Autocoerce]',
+ coerce => 1,
 );
 
-my $find_mods;
-$find_mods = do {
- no warnings 'recursion';
+sub id {
+ my $tikz = shift;
 
- Sub::Name::subname('find_mods' => sub {
-  my ($set, $layers, $others) = @_;
+ join $;, map {
+  my $val = $tikz->$_;
+  defined($val) ? "$val" : '(undef)';
+ } qw/unit format scale width height origin/;
+}
+
+my $find_mods = do {
+ our %seen;
+
+ my $find_mods_rec;
+ $find_mods_rec = do {
+  no warnings 'recursion';
+
+  Sub::Name::subname('find_mods_rec' => sub {
+   my ($set, $layers, $others) = @_;
 
-  for ($set->mods) {
-   if ($_->isa('LaTeX::TikZ::Mod::Layer')) {
-    push @$layers, $_;
-   } else {
-    push @$others, $_;
+   for ($set->mods) {
+    my $tag = $_->tag;
+    next if $seen{$tag}++;
+
+    if ($_->isa('LaTeX::TikZ::Mod::Layer')) {
+     push @$layers, $_;
+    } else {
+     push @$others, $_;
+    }
    }
-  }
 
-  my @subsets = $set->isa('LaTeX::TikZ::Set::Sequence')
-                ? $set->kids
-                : $set->isa('LaTeX::TikZ::Set::Path')
-                  ? $set->ops
-                  : ();
+   my @subsets = $set->isa('LaTeX::TikZ::Set::Sequence')
+                 ? $set->kids
+                 : $set->isa('LaTeX::TikZ::Set::Path')
+                   ? $set->ops
+                   : ();
+
+   $find_mods_rec->($_, $layers, $others) for @subsets;
+  });
+ };
+
+ Sub::Name::subname('find_mods' => sub {
+  local %seen = ();
 
-  $find_mods->($_, $layers, $others) for @subsets;
- })
+  $find_mods_rec->(@_);
+ });
 };
 
 sub render {
@@ -159,6 +184,14 @@ sub thickness {
  0.8 * $width * ($tikz->scale / 5);
 }
 
+LaTeX::TikZ::Interface->register(
+ formatter => sub {
+  shift;
+
+  __PACKAGE__->new(@_);
+ },
+);
+
 __PACKAGE__->meta->make_immutable;
 
 =head1 AUTHOR