Fix tests that were testing object internals instead of accessors.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ActionChain.pm
CommitLineData
141459fa 1package Catalyst::ActionChain;
2
059c085b 3use Moose;
4extends qw(Catalyst::Action);
141459fa 5
059c085b 6has chain => (is => 'rw');
141459fa 7
8=head1 NAME
9
10Catalyst::ActionChain - Chain of Catalyst Actions
11
12=head1 SYNOPSIS
13
b2ddf6d7 14See L<Catalyst::Manual::Intro> for more info about Chained actions.
141459fa 15
16=head1 DESCRIPTION
17
18This class represents a chain of Catalyst Actions. It behaves exactly like
19the action at the *end* of the chain except on dispatch it will execute all
20the actions in the chain in order.
21
b2ddf6d7 22=cut
141459fa 23
b2ddf6d7 24use overload (
141459fa 25
b2ddf6d7 26 # Stringify to reverse for debug output etc.
27 q{""} => sub { shift->{reverse} },
141459fa 28
b2ddf6d7 29 # Codulate to execute to invoke the encapsulated action coderef
30 '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; },
31
32 # Make general $stuff still work
33 fallback => 1,
34
35);
141459fa 36
141459fa 37
38sub dispatch {
39 my ( $self, $c ) = @_;
d7962771 40 my @captures = @{$c->req->captures||[]};
ee1ac377 41 my @chain = @{ $self->chain };
42 my $last = pop(@chain);
43 foreach my $action ( @chain ) {
d7962771 44 my @args;
1c34f703 45 if (my $cap = $action->attributes->{CaptureArgs}) {
d7962771 46 @args = splice(@captures, 0, $cap->[0]);
47 }
48 local $c->request->{arguments} = \@args;
141459fa 49 $action->dispatch( $c );
50 }
ee1ac377 51 $last->dispatch( $c );
141459fa 52}
53
b2ddf6d7 54sub from_chain {
55 my ( $self, $actions ) = @_;
56 my $final = $actions->[-1];
57 return $self->new({ %$final, chain => $actions });
58}
59
6680c772 60no Moose;
e5ecd5bc 61__PACKAGE__->meta->make_immutable;
b2ddf6d7 621;
63
64__END__
65
66=head1 METHODS
67
68=head2 chain
69
70Accessor for the action chain; will be an arrayref of the Catalyst::Action
71objects encapsulated by this chain.
72
73=head2 dispatch( $c )
74
75Dispatch this action chain against a context; will dispatch the encapsulated
76actions in order.
77
141459fa 78=head2 from_chain( \@actions )
79
80Takes a list of Catalyst::Action objects and constructs and returns a
81Catalyst::ActionChain object representing a chain of these actions
82
059c085b 83=head2 meta
84
85Provided by Moose
141459fa 86
141459fa 87=head1 AUTHOR
88
89Matt S. Trout
90
91=head1 COPYRIGHT
92
93This program is free software, you can redistribute it and/or modify it under
94the same terms as Perl itself.
95
96=cut