first cut at :ChildOf
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ActionChain.pm
1 package Catalyst::ActionChain;
2
3 use strict;
4 use base qw/Catalyst::Action/;
5
6 __PACKAGE__->mk_accessors(qw/chain/);
7
8 use overload (
9
10     # Stringify to reverse for debug output etc.
11     q{""} => sub { shift->{reverse} },
12
13     # Codulate to execute to invoke the encapsulated action coderef
14     '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; },
15
16     # Make general $stuff still work
17     fallback => 1,
18
19 );
20
21 =head1 NAME
22
23 Catalyst::ActionChain - Chain of Catalyst Actions
24
25 =head1 SYNOPSIS
26
27 See L<Catalyst>.
28
29 =head1 DESCRIPTION
30
31 This class represents a chain of Catalyst Actions. It behaves exactly like
32 the action at the *end* of the chain except on dispatch it will execute all
33 the actions in the chain in order.
34
35 =head1 METHODS
36
37 =head2 chain
38
39 Accessor for the action chain; will be an arrayref of the Catalyst::Action
40 objects encapsulated by this chain.
41
42 =head2 dispatch( $c )
43
44 Dispatch this action chain against a context; will dispatch the encapsulated
45 actions in order.
46
47 =cut
48
49 sub dispatch {
50     my ( $self, $c ) = @_;
51     foreach my $action ( @{ $self->chain } ) {
52         $action->dispatch( $c );
53     }
54 }
55
56 =head2 from_chain( \@actions )
57
58 Takes a list of Catalyst::Action objects and constructs and returns a
59 Catalyst::ActionChain object representing a chain of these actions
60
61 =cut
62
63 sub from_chain {
64     my ( $self, $actions ) = @_;
65     my $final = $actions->[-1];
66     return $self->new({ %$final, chain => $actions });
67 }
68
69 =head1 AUTHOR
70
71 Matt S. Trout
72
73 =head1 COPYRIGHT
74
75 This program is free software, you can redistribute it and/or modify it under
76 the same terms as Perl itself.
77
78 =cut
79
80 1;