Fix for Catalyst::Action::REST
[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 use overload (
32
33     # Stringify to reverse for debug output etc.
34     q{""} => sub { shift->{reverse} },
35
36     # Codulate to execute to invoke the encapsulated action coderef
37     '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; },
38
39     # Make general $stuff still work
40     fallback => 1,
41
42 );
43
44
45
46 no warnings 'recursion';
47
48 #__PACKAGE__->mk_accessors(qw/class namespace reverse attributes name code/);
49
50 sub dispatch {    # Execute ourselves against a context
51     my ( $self, $c ) = @_;
52     return $c->execute( $self->class, $self );
53 }
54
55 sub execute {
56   my $self = shift;
57   $self->code->(@_);
58 }
59
60 sub match {
61     my ( $self, $c ) = @_;
62     #would it be unreasonable to store the number of arguments
63     #the action has as it's own attribute?
64     #it would basically eliminate the code below.  ehhh. small fish
65     return 1 unless exists $self->attributes->{Args};
66     my $args = $self->attributes->{Args}[0];
67     return 1 unless defined($args) && length($args);
68     return scalar( @{ $c->req->args } ) == $args;
69 }
70
71 __PACKAGE__->meta->make_immutable;
72
73 1;
74
75 __END__
76
77 =head1 METHODS
78
79 =head2 attributes
80
81 The sub attributes that are set for this action, like Local, Path, Private
82 and so on. This determines how the action is dispatched to.
83
84 =head2 class
85
86 Returns the class name where this action is defined.
87
88 =head2 code
89
90 Returns a code reference to this action.
91
92 =head2 dispatch( $c )
93
94 Dispatch this action against a context
95
96 =head2 execute( $controller, $c, @args )
97
98 Execute this action's coderef against a given controller with a given
99 context and arguments
100
101 =head2 match( $c )
102
103 Check Args attribute, and makes sure number of args matches the setting.
104 Always returns true if Args is omitted.
105
106 =head2 namespace
107
108 Returns the private namespace this action lives in.
109
110 =head2 reverse
111
112 Returns the private path for this action.
113
114 =head2 name
115
116 returns the sub name of this action.
117
118 =head2 meta
119
120 Provided by Moose
121
122 =head1 AUTHORS
123
124 Catalyst Contributors, see Catalyst.pm
125
126 =head1 COPYRIGHT
127
128 This program is free software, you can redistribute it and/or modify it under
129 the same terms as Perl itself.
130
131 =cut