X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FFunctor.pm;h=ac51ccf73d2d763331a2b6693fd1bf8050395677;hb=61a93a58351bf2d238dcf81a1a557112b0c0ee85;hp=d4ba0740b96d5abd917a18a6007bc6fc06911167;hpb=ccef95119764f56b5f77bd85c5199f5d375ca08e;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Functor.pm b/lib/LaTeX/TikZ/Functor.pm index d4ba074..ac51ccf 100644 --- a/lib/LaTeX/TikZ/Functor.pm +++ b/lib/LaTeX/TikZ/Functor.pm @@ -9,16 +9,42 @@ LaTeX::TikZ::Functor - Build functor methods that recursively visit nodes of a L =head1 VERSION -Version 0.01 +Version 0.02 =cut -our $VERSION = '0.01'; +our $VERSION = '0.02'; =head1 DESCRIPTION -A functor takes a L tree and clones it according to certain rules. -Rules can apply not only to L objects, but also to the L objects they contain. +A functor takes a L tree and returns a new, transmuted version of it according to certain rules. +It recursively visits all the nodes of the tree, building a new set out of the result of the functor on the child sets. + +Rules are stored as L objects. +They can apply not only to L consumer objects, but also to the L consumer objects they contain. +When the functor is called against a set object and that the returned set is different from the original (as told by C<==>, which defaults to object identity), then the functor is also applied to all the mods of the set, and their transformed counterparts are added to the new set. + +When the functor is called onto a set or mod object, all its associated rules are tried successively, and the handler of the first matching rule is executed with : + +=over 4 + +=item * + +the functor object as its first argument ; + +=item * + +the current set or mod object as its second argument ; + +=item * + +the arguments passed to the functor itself starting at the third argument. + +=back + +The handler is expected to return the new set or mod that will replace the old one in the resulting set tree. + +If no matching rule is found, the object is returned as-is. =cut @@ -54,9 +80,13 @@ BEGIN { =head1 METHODS -=head2 C<< new rules => [ $spec1 => $handler1, $spec2 => $handler2, ... ] >> +=head2 C -Creates a new functor object that will use both the default and these user-specified rules. + my $functor = LaTeX::TikZ::Functor->new( + rules => [ $spec1 => $handler1, $spec2 => $handler2, ... ], + ); + +Creates a new functor object that will use both the default and the user-specified rules. The functor is also a code reference that expects to be called against L objects. The default set and mod rules clone their relevant objects, so you get a clone functor (for the default set types) if you don't specify any user rule. @@ -65,7 +95,7 @@ The default set and mod rules clone their relevant objects, so you get a clone f my $clone = Tikz->functor; my $dup = $set->$clone; -If there is already a default rule for one of the C<$spec>s, it is replaced by the new one ; otherwise, the user rule is appended to the list of default rules. +If there is already a default rule for one of the C<$spec>s, it is replaced by the new one ; otherwise, the user rule is inserted into the list of default rules after all its descendants' rules and before all its ancestors' rules. # A translator my $translate = Tikz->functor( @@ -178,11 +208,13 @@ LaTeX::TikZ::Interface->register( }, ); -=head2 C<< default_rule $spec => $handler >> +=head2 C + + LaTeX::TikZ::Functor->default_rule($spec => $handler) Adds to all subsequently created functors a default rule for the class or role C<$spec>. -An exception is thrown if there is already a default rule for C<$spec> ; otherwise, the new rule is appended to the current list of rules. +An exception is thrown if there is already a default rule for C<$spec> ; otherwise, the new rule is inserted into the current list of default rules after all its descendants' rules and before all its ancestors' rules. But if C<$spec> begins with C<'+'>, the rule will replace I default rules that apply to subclasses or subroles of C<$spec> (including C<$spec> itself). Returns true if and only if an existent rule was replaced. @@ -209,7 +241,7 @@ sub default_rule { =head1 SEE ALSO -L. +L, L. =head1 AUTHOR @@ -230,7 +262,7 @@ You can find documentation for this module with the perldoc command. =head1 COPYRIGHT & LICENSE -Copyright 2010 Vincent Pit, all rights reserved. +Copyright 2010,2011,2012,2013,2014,2015 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.