X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FActionChain.pm;h=60fd6db947a5954951bafad00fb2385528cb170f;hb=4cfa1efab08273928363729c3843f18a3a66a4c4;hp=2bcc31fb3c1b507ea41d3cf965ad08e519c5190a;hpb=141459fa3fc9852fd6f05138caddb410bbe2949c;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/ActionChain.pm b/lib/Catalyst/ActionChain.pm index 2bcc31f..60fd6db 100644 --- a/lib/Catalyst/ActionChain.pm +++ b/lib/Catalyst/ActionChain.pm @@ -1,9 +1,25 @@ package Catalyst::ActionChain; -use strict; -use base qw/Catalyst::Action/; +use Moose; +extends qw(Catalyst::Action); -__PACKAGE__->mk_accessors(qw/chain/); +has chain => (is => 'rw'); + +=head1 NAME + +Catalyst::ActionChain - Chain of Catalyst Actions + +=head1 SYNOPSIS + +See L for more info about Chained actions. + +=head1 DESCRIPTION + +This class represents a chain of Catalyst Actions. It behaves exactly like +the action at the *end* of the chain except on dispatch it will execute all +the actions in the chain in order. + +=cut use overload ( @@ -18,19 +34,32 @@ use overload ( ); -=head1 NAME - -Catalyst::ActionChain - Chain of Catalyst Actions -=head1 SYNOPSIS +sub dispatch { + my ( $self, $c ) = @_; + my @captures = @{$c->req->captures||[]}; + my @chain = @{ $self->chain }; + my $last = pop(@chain); + foreach my $action ( @chain ) { + my @args; + if (my $cap = $action->attributes->{CaptureArgs}) { + @args = splice(@captures, 0, $cap->[0]); + } + local $c->request->{arguments} = \@args; + $action->dispatch( $c ); + } + $last->dispatch( $c ); +} -See L. +sub from_chain { + my ( $self, $actions ) = @_; + my $final = $actions->[-1]; + return $self->new({ %$final, chain => $actions }); +} -=head1 DESCRIPTION +1; -This class represents a chain of Catalyst Actions. It behaves exactly like -the action at the *end* of the chain except on dispatch it will execute all -the actions in the chain in order. +__END__ =head1 METHODS @@ -44,27 +73,14 @@ objects encapsulated by this chain. Dispatch this action chain against a context; will dispatch the encapsulated actions in order. -=cut - -sub dispatch { - my ( $self, $c ) = @_; - foreach my $action ( @{ $self->chain } ) { - $action->dispatch( $c ); - } -} - =head2 from_chain( \@actions ) Takes a list of Catalyst::Action objects and constructs and returns a Catalyst::ActionChain object representing a chain of these actions -=cut +=head2 meta -sub from_chain { - my ( $self, $actions ) = @_; - my $final = $actions->[-1]; - return $self->new({ %$final, chain => $actions }); -} +Provided by Moose =head1 AUTHOR @@ -76,5 +92,3 @@ This program is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut - -1;