X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FActionChain.pm;h=fc39f0974bc3d4b87e19b7cbd4310c1f3315efc2;hb=f9bdcfacb19ab17ed0b889ed6366272d8bf166fc;hp=2fd63d93d46008929cd687c5b08993d9eaa4447c;hpb=b2ddf6d7e1ea8f9b281ce5da27ecadf3152e151d;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/ActionChain.pm b/lib/Catalyst/ActionChain.pm index 2fd63d9..fc39f09 100644 --- a/lib/Catalyst/ActionChain.pm +++ b/lib/Catalyst/ActionChain.pm @@ -1,8 +1,10 @@ package Catalyst::ActionChain; -use strict; -use base qw/Catalyst::Action/; +use Moose; +extends qw(Catalyst::Action); +has chain => (is => 'rw'); +no Moose; =head1 NAME @@ -20,22 +22,6 @@ the actions in the chain in order. =cut -__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, - -); - - sub dispatch { my ( $self, $c ) = @_; my @captures = @{$c->req->captures||[]}; @@ -43,11 +29,19 @@ sub dispatch { my $last = pop(@chain); foreach my $action ( @chain ) { my @args; - if (my $cap = $action->attributes->{CaptureArgs}) { - @args = splice(@captures, 0, $cap->[0]); + 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. We + # check the global config flag 'abort_chain_on_error_fix', but this + # is now considered true by default, so unless someone explictly sets + # it to false we default it to true (if its not defined). + my $abort = defined($c->config->{abort_chain_on_error_fix}) ? + $c->config->{abort_chain_on_error_fix} : 1; + return if ($c->has_errors && $abort); } $last->dispatch( $c ); } @@ -58,6 +52,16 @@ sub from_chain { 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__ @@ -79,15 +83,21 @@ actions in order. 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 + +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