some more comments and little changes as well as some notes. test output still the...
[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     #Moose todo: grrrrrr. this is no good. i don't know enough about it to
51     # debug it though. why can't we just call the accessor?
52     local $c->{namespace} = $self->namespace;
53     return $c->execute( $self->class, $self );
54
55     #believed to be equivalent:
56     #my $orig = $c->namespace;
57     #$c->namespace($self->namespace);
58     #my $ret = $c->execute( $self->class, $self );
59     #$c->namespace($orig);
60     #return $ret;
61 }
62
63 sub execute {
64   my $self = shift;
65   $self->code->(@_);
66 }
67
68 sub match {
69     my ( $self, $c ) = @_;
70     return 1 unless exists $self->attributes->{Args};
71     my $args = $self->attributes->{Args}[0];
72     return 1 unless defined($args) && length($args);
73     return scalar( @{ $c->req->args } ) == $args;
74 }
75
76 1;
77
78 __END__
79
80 =head1 METHODS
81
82 =head2 attributes
83
84 The sub attributes that are set for this action, like Local, Path, Private
85 and so on. This determines how the action is dispatched to.
86
87 =head2 class
88
89 Returns the class name where this action is defined.
90
91 =head2 code
92
93 Returns a code reference to this action.
94
95 =head2 dispatch( $c )
96
97 Dispatch this action against a context
98
99 =head2 execute( $controller, $c, @args )
100
101 Execute this action's coderef against a given controller with a given
102 context and arguments
103
104 =head2 match( $c )
105
106 Check Args attribute, and makes sure number of args matches the setting.
107 Always returns true if Args is omitted.
108
109 =head2 namespace
110
111 Returns the private namespace this action lives in.
112
113 =head2 reverse
114
115 Returns the private path for this action.
116
117 =head2 name
118
119 returns the sub name of this action.
120
121 =head2 meta
122
123 Provided by Moose
124
125 =head1 AUTHOR
126
127 Matt S. Trout
128
129 =head1 COPYRIGHT
130
131 This program is free software, you can redistribute it and/or modify it under
132 the same terms as Perl itself.
133
134 =cut