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=0b58602c72e2d5d90753355876dbbcad15ea8c11;hp=cf48342db99277c69c612fe220df89e05b652eed;hb=342d21698a97962c51114b6ebc6bb8626511cfc6;hpb=536bee890cf24e0e4bcda7562e7b70cc03ca0620 diff --git a/lib/Catalyst/ActionChain.pm b/lib/Catalyst/ActionChain.pm index cf48342..0b58602 100644 --- a/lib/Catalyst/ActionChain.pm +++ b/lib/Catalyst/ActionChain.pm @@ -4,7 +4,6 @@ use Moose; extends qw(Catalyst::Action); has chain => (is => 'rw'); - no Moose; =head1 NAME @@ -30,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 ); } @@ -45,6 +52,31 @@ 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; +} + +# the scheme defined at the end of the chain is the one we use +# but warn if too many. + +sub scheme { + my $self = shift; + my @chain = @{ $self->chain }; + my ($scheme, @more) = map { + exists $_->attributes->{Scheme} ? $_->attributes->{Scheme}[0] : (); + } reverse @chain; + + warn "$self is a chain with two many Scheme attributes (only one is allowed)" + if @more; + + return $scheme; +} + __PACKAGE__->meta->make_immutable; 1; @@ -67,6 +99,14 @@ actions in order. Takes a list of Catalyst::Action objects and constructs and returns a Catalyst::ActionChain object representing a chain of these actions +=head2 number_of_captures + +Returns the total number of captures for the entire chain of actions. + +=head2 scheme + +Any defined scheme for the actionchain + =head2 meta Provided by Moose