Fixes rt.cpan.org #57361
[catagits/Catalyst-Manual.git] / lib / Catalyst / Manual / Actions.pod
index 6cd5949..41247c8 100644 (file)
@@ -5,16 +5,17 @@ Catalyst::Manual::Actions - Catalyst Reusable Actions
 =head1 DESCRIPTION
 
 This section of the manual describes the reusable action system in
-Catalyst, how they work, descriptions of some existing ones, and how to
-write your own.  Reusable actions are attributes on Catalyst methods
-that allow you to decorate your method with functions running before or
-after the method call.  This can be used to implement commonly used
-action patterns, while still leaving you full freedom to customize them.
+Catalyst, how such actions work, descriptions of some existing ones, and
+how to write your own.  Reusable actions are attributes on Catalyst
+methods that allow you to decorate your method with functions running
+before or after the method call.  This can be used to implement commonly
+used action patterns, while still leaving you full freedom to customize
+them.
 
 =head1 USING ACTIONS
 
-This is pretty simple. It works just like the normal dispatch attributes
-you are used to, like Local or Private:
+This is pretty simple. Actions work just like the normal dispatch
+attributes you are used to, like Local or Private:
 
   sub Hello :Local :ActionClass('SayBefore') { 
        $c->res->output( 'Hello '.$c->stash->{what} );
@@ -22,10 +23,11 @@ you are used to, like Local or Private:
 
 In this example, we expect the SayBefore action to magically populate
 stash with something relevant before C<Hello> is run.  In the next
-section we'll show you how to implement it. If you want it in another
-namespace than Catalyst::Action you can prefix the action name with a
-'+', for instance '+Foo::SayBefore', or if you just want it under your
-application namespace instead, use MyAction, like MyAction('SayBefore').
+section we'll show you how to implement it. If you want it in a
+namespace other than Catalyst::Action you can prefix the action name
+with a '+', for instance '+Foo::SayBefore', or if you just want it under
+your application namespace instead, use MyAction, like
+MyAction('SayBefore').
 
 =head1 WRITING YOUR OWN ACTIONS
 
@@ -33,23 +35,63 @@ Implementing the action itself is almost as easy. Just use
 L<Catalyst::Action> as a base class and decorate the C<execute> call in
 the Action class:
 
-  package Catalyst::Action::SayBefore;
+  package Catalyst::Action::MyAction;
+  use Moose;
+  use namespace::autoclean;
+  
+  extends 'Catalyst::Action';
 
-  use base 'Catalyst::Action';
+  before 'execute' => sub {
+    my ( $self, $controller, $c, $test ) = @_;
+    $c->stash->{what} = 'world';
+  };
+
+  after 'execute' => sub {
+      my ( $self, $controller, $c, $test ) = @_;
+      $c->stash->{foo} = 'bar';
+  };
+
+  __PACKAGE__->meta->make_immutable;
+
+Pretty simple, huh?
 
-  sub execute {
-    my $self = shift;
-    my ( $controller, $c, $test ) = @_;
+=head1 ACTION ROLES
+
+You can only have one action class per action, which can be somewhat
+inflexible.
+
+The solution to this is to use L<Catalyst::Controller::ActionRole>, which
+would make the example above look like this:
+
+  package Catalyst::ActionRole::MyActionRole;
+  use Moose::Role;
+
+  before 'execute' => sub {
+    my ( $self, $controller, $c, $test ) = @_;
     $c->stash->{what} = 'world';
-    $self->NEXT::execute( @_ );
   };
 
+  after 'execute' => sub {
+      my ( $self, $controller, $c, $test ) = @_;
+      $c->stash->{foo} = 'bar';
+  };
+  
   1;
 
-If you want to do something after the action, just put it after the
-C<execute> call. Pretty simple, huh?
+and this would be used in a controller like this:
 
-=head1 ACTIONS
+  package MyApp::Controller::Foo;
+  use Moose;
+  use namespace::autoclean;
+  BEGIN { extends 'Catalyst::Controller::ActionRole'; }
+
+  sub foo : Does('MyActionRole') {
+      my ($self, $c) = @_;
+  }
+
+  1;
+
+=head1 EXAMPLE ACTIONS
 
 =head2 Catalyst::Action::RenderView
 
@@ -57,11 +99,24 @@ This is meant to decorate end actions. It's similar in operation to
 L<Catalyst::Plugin::DefaultEnd>, but allows you to decide on an action
 level rather than on an application level where it should be run.
 
-=head1 AUTHOR
+=head2 Catalyst::Action::REST
+
+Provides additional syntax for dispatching based upon the HTTP method
+of the request.
 
-The Catalyst Core Team - see http://catalyst.perl.org/
+=head1 EXAMPLE ACTIONROLES
+
+=head2 Catalyst::ActionRole::ACL
+
+Provides ACLs for role membership by decorating your actions.
+
+=head1 AUTHORS
+
+Catalyst Contributors, see Catalyst.pm
 
 =head1 COPYRIGHT
 
-This program is free software. You can redistribute it and/or modify it
-under the same terms as Perl itself.
+This library is free software. You can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut