X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FActionChain.pm;fp=lib%2FCatalyst%2FActionChain.pm;h=cf48342db99277c69c612fe220df89e05b652eed;hb=4a41d5d1ec3187cc41e15767b21c14b2aee31740;hp=0000000000000000000000000000000000000000;hpb=2757db2c7c600c8a0b8e2b4366f38c97804c2844;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/ActionChain.pm b/lib/Catalyst/ActionChain.pm new file mode 100644 index 0000000..cf48342 --- /dev/null +++ b/lib/Catalyst/ActionChain.pm @@ -0,0 +1,83 @@ +package Catalyst::ActionChain; + +use Moose; +extends qw(Catalyst::Action); + +has chain => (is => 'rw'); + +no Moose; + +=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 + +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 ); +} + +sub from_chain { + my ( $self, $actions ) = @_; + my $final = $actions->[-1]; + return $self->new({ %$final, chain => $actions }); +} + +__PACKAGE__->meta->make_immutable; +1; + +__END__ + +=head1 METHODS + +=head2 chain + +Accessor for the action chain; will be an arrayref of the Catalyst::Action +objects encapsulated by this chain. + +=head2 dispatch( $c ) + +Dispatch this action chain against a context; will dispatch the encapsulated +actions in order. + +=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 + +=head2 meta + +Provided by Moose + +=head1 AUTHORS + +Catalyst Contributors, see Catalyst.pm + +=head1 COPYRIGHT + +This library is free software. You can redistribute it and/or modify it under +the same terms as Perl itself. + +=cut