X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FActionChain.pm;h=b54d553c0ba0fd2dd84d7a26e9f76f21a97bcbd5;hp=2bcc31fb3c1b507ea41d3cf965ad08e519c5190a;hb=569b665ec6e28d629c114a5fe34894ad71e8e588;hpb=141459fa3fc9852fd6f05138caddb410bbe2949c diff --git a/lib/Catalyst/ActionChain.pm b/lib/Catalyst/ActionChain.pm index 2bcc31f..b54d553 100644 --- a/lib/Catalyst/ActionChain.pm +++ b/lib/Catalyst/ActionChain.pm @@ -1,22 +1,10 @@ package Catalyst::ActionChain; -use strict; -use base qw/Catalyst::Action/; +use Moose; +extends qw(Catalyst::Action); -__PACKAGE__->mk_accessors(qw/chain/); - -use overload ( - - # Stringify to reverse for debug output etc. - q{""} => sub { shift->{reverse} }, - - # Codulate to execute to invoke the encapsulated action coderef - '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; }, - - # Make general $stuff still work - fallback => 1, - -); +has chain => (is => 'rw'); +no Moose; =head1 NAME @@ -24,7 +12,7 @@ Catalyst::ActionChain - Chain of Catalyst Actions =head1 SYNOPSIS -See L. +See L for more info about Chained actions. =head1 DESCRIPTION @@ -32,6 +20,47 @@ 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 + +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->number_of_captures) { + @args = splice(@captures, 0, $cap); + } + local $c->request->{arguments} = \@args; + $action->dispatch( $c ); + + # break the chain if exception occurs in the middle of chain + return if (@{$c->error} && $c->config->{detach_on_die}); + } + $last->dispatch( $c ); +} + +sub from_chain { + my ( $self, $actions ) = @_; + my $final = $actions->[-1]; + return $self->new({ %$final, chain => $actions }); +} + +sub number_of_captures { + my ( $self ) = @_; + my $chain = $self->chain; + my $captures = 0; + + $captures += $_->number_of_captures for @$chain; + return $captures; +} + +__PACKAGE__->meta->make_immutable; +1; + +__END__ + =head1 METHODS =head2 chain @@ -44,37 +73,26 @@ 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 number_of_captures -sub from_chain { - my ( $self, $actions ) = @_; - my $final = $actions->[-1]; - return $self->new({ %$final, chain => $actions }); -} +Returns the total number of captures for the entire chain of actions. + +=head2 meta + +Provided by Moose -=head1 AUTHOR +=head1 AUTHORS -Matt S. Trout +Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT -This program is free software, you can redistribute it and/or modify it under +This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut - -1;