Initial commit of Moosified Catalyst parts.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Action.pm
1 package Catalyst::Action;
2
3 =head1 NAME
4
5 Catalyst::Action - Catalyst Action
6
7 =head1 SYNOPSIS
8
9     <form action="[%c.uri_for(c.action.reverse)%]">
10
11 =head1 DESCRIPTION
12
13 This class represents a Catalyst Action. You can access the object for the 
14 currently dispatched action via $c->action. See the L<Catalyst::Dispatcher>
15 for more information on how actions are dispatched. Actions are defined in
16 L<Catalyst::Controller> subclasses.
17
18 =cut
19
20 use Moose;
21
22 has class       => (is => 'rw');
23 has namespace   => (is => 'rw');
24 has 'reverse'   => (is => 'rw');
25 has attributes  => (is => 'rw');
26 has name        => (is => 'rw');
27 has code        => (is => 'rw');
28
29 no Moose;
30
31 no warnings 'recursion';
32
33 #__PACKAGE__->mk_accessors(qw/class namespace reverse attributes name code/);
34
35 use overload (
36
37     # Stringify to reverse for debug output etc.
38     q{""} => sub { shift->reverse() },
39
40     # Codulate to execute to invoke the encapsulated action coderef
41     '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; },
42
43     # Make general $stuff still work
44     fallback => 1,
45
46 );
47
48 sub dispatch {    # Execute ourselves against a context
49     my ( $self, $c ) = @_;
50     local $c->{namespace} = $self->namespace;
51     return $c->execute( $self->class, $self );
52 }
53
54 sub execute {
55   my $self = shift;
56   $self->code->(@_);
57 }
58
59 sub match {
60     my ( $self, $c ) = @_;
61     return 1 unless exists $self->attributes->{Args};
62     my $args = $self->attributes->{Args}[0];
63     return 1 unless defined($args) && length($args);
64     return scalar( @{ $c->req->args } ) == $args;
65 }
66
67 1;
68
69 __END__
70
71 =head1 METHODS
72
73 =head2 attributes
74
75 The sub attributes that are set for this action, like Local, Path, Private
76 and so on. This determines how the action is dispatched to.
77
78 =head2 class
79
80 Returns the class name where this action is defined.
81
82 =head2 code
83
84 Returns a code reference to this action.
85
86 =head2 dispatch( $c )
87
88 Dispatch this action against a context
89
90 =head2 execute( $controller, $c, @args )
91
92 Execute this action's coderef against a given controller with a given
93 context and arguments
94
95 =head2 match( $c )
96
97 Check Args attribute, and makes sure number of args matches the setting.
98 Always returns true if Args is omitted.
99
100 =head2 namespace
101
102 Returns the private namespace this action lives in.
103
104 =head2 reverse
105
106 Returns the private path for this action.
107
108 =head2 name
109
110 returns the sub name of this action.
111
112 =head2 meta
113
114 Provided by Moose
115
116 =head1 AUTHOR
117
118 Matt S. Trout
119
120 =head1 COPYRIGHT
121
122 This program is free software, you can redistribute it and/or modify it under
123 the same terms as Perl itself.
124
125 =cut