X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FSet%2FChain.pm;h=dae9ccc823547d15f5e7a0e46edaafb1a8e1621a;hb=062ab95259610ce39ace60365b659d6113420ce7;hp=8795de1bb15bfbe0197a9821508f4a7e1e09ef0f;hpb=95aada0ec5b3c5a0d78ed0ad53436b0e70860bc7;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Set/Chain.pm b/lib/LaTeX/TikZ/Set/Chain.pm index 8795de1..dae9ccc 100644 --- a/lib/LaTeX/TikZ/Set/Chain.pm +++ b/lib/LaTeX/TikZ/Set/Chain.pm @@ -16,14 +16,15 @@ Version 0.02 our $VERSION = '0.02'; use LaTeX::TikZ::Set::Point; +use LaTeX::TikZ::Set::Raw; use LaTeX::TikZ::Interface; use LaTeX::TikZ::Functor; use LaTeX::TikZ::Tools; -use Any::Moose; -use Any::Moose 'Util::TypeConstraints' => [ qw ]; +use Mouse; +use Mouse::Util::TypeConstraints qw; =head1 RELATIONSHIPS @@ -68,7 +69,7 @@ sub kids { @{$_[0]->_kids} } =head2 C A code reference that describes how two successive elements of the chain are linked. -It is called repeatedly with these arguments : +When the L method is called, the connector is run repeatedly with these arguments : =over 4 @@ -88,6 +89,10 @@ The C<$i>-th L object in the chain. The C<$i+1>-th L object in the chain. +=item * + +The L object. + =back You can also pass a string, which will be upgraded to a code reference constantly returning that string ; or an array reference, which will be turned into a code reference returning the C<$i>-th element of the array when asked for the C<$i>-th link. @@ -112,11 +117,16 @@ has 'connector' => ( coerce => 1, ); -has '_links' => ( - is => 'ro', - isa => 'ArrayRef[Str]', - init_arg => undef, - default => sub { [ ] }, +=head2 C + +A boolean that indicates whether the path is a cycle or not. + +=cut + +has 'cycle' => ( + is => 'ro', + isa => 'Bool', + default => 0, ); =head1 METHODS @@ -131,68 +141,71 @@ sub add { my $set = shift; $ltsp_tc->assert_valid($_) for @_; - return $set unless @_; - - my $kids = $set->_kids; - my $links = $set->_links; - my $conn = $set->connector; - push @$kids, shift @_ unless @$kids; - return $set unless @_; - - my $prev = $kids->[-1]; - for my $i (0 .. $#_) { - my $next = $_[$i]; - my $link = $set->$conn($#$kids, $prev, $next); - confess('Invalid connector') unless defined $link and not blessed $link; - push @$links, $link; - push @$kids, $next; - $prev = $next; - } + push @{$set->_kids}, @_; $set; } -sub BUILD { - my ($set) = @_; +=head2 C + +=cut + +sub path { + my $set = shift; my @kids = $set->kids; - return unless @kids >= 2; + return '' unless @kids; - my $links = $set->_links; my $conn = $set->connector; my $prev = $kids[0]; + my $path = $prev->path(@_); + + if ($set->cycle) { + push @kids, LaTeX::TikZ::Set::Raw->new( + content => 'cycle', + ); + } + + my $tikz = $_[0]; for my $i (1 .. $#kids) { - my $next = $_[$i]; - my $link = $set->$conn($i - 1, $prev, $next); + my $next = $kids[$i]; + my $link = $set->$conn($i - 1, $prev, $next, $tikz); confess('Invalid connector') unless defined $link and not blessed $link; - push @$links, $link; - $prev = $next; + $link = " $link "; + $link =~ s/\s+/ /g; + $path .= $link . $next->path(@_); + $prev = $next; } + + return $path; } -=head2 C +=head2 C =cut -sub path { +sub begin { my $set = shift; - my @kids = $set->kids; - return '' unless @kids; + my @kids = $set->kids; + return undef unless @kids; - my $links = $set->_links; - my $conn = $set->connector; + $kids[0]->begin; +} - my $path = $kids[0]->path(@_); - for my $i (1 .. $#kids) { - my $link = ' ' . $links->[$i - 1] . ' '; - $link =~ s/\s+/ /g; - $path .= $link . $kids[$i]->path(@_); - } +=head2 C - return $path; +=cut + +sub end { + my $set = shift; + + my @kids = $set->kids; + return undef unless @kids; + + $kids[-1]->end; } LaTeX::TikZ::Interface->register( @@ -230,6 +243,7 @@ LaTeX::TikZ::Functor->default_rule( $set->new( kids => [ map $_->$functor(@args), $set->kids ], connector => $set->connector, + cycle => $set->cycle, ); } ); @@ -259,7 +273,7 @@ You can find documentation for this module with the perldoc command. =head1 COPYRIGHT & LICENSE -Copyright 2011 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.