added documentation for the configuration option "action_args".
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Controller.pm
index d52ae3f..ee39c7b 100644 (file)
@@ -2,7 +2,7 @@ package Catalyst::Controller;
 
 use Moose;
 use Moose::Util qw/find_meta/;
-
+use List::MoreUtils qw/uniq/;
 use namespace::clean -except => 'meta';
 
 BEGIN { extends qw/Catalyst::Component MooseX::MethodAttributes::Inheritable/; }
@@ -187,23 +187,20 @@ sub get_action_methods {
           . $meta->name
           . " cannot support register_actions." )
       unless $meta->can('get_nearest_methods_with_attributes');
+    my @methods = $meta->get_nearest_methods_with_attributes;
 
-    # Find (and de-dup) action methods from attributes and those from config.
-    my %methods = (
-        map({ $_->name => 1 } $meta->get_nearest_methods_with_attributes),
-        %{ $self->_controller_actions }
-    );
-
-    if (ref $self) {
-        foreach (keys %methods) {
+    # actions specified via config are also action_methods
+    push(
+        @methods,
+        map {
             $meta->find_method_by_name($_)
               || confess( 'Action "'
                   . $_
                   . '" is not available from controller '
-                  . ( ref $self ) );
-        }
-    }
-    return keys %methods;
+                  . ( ref $self ) )
+          } keys %{ $self->_controller_actions }
+    ) if ( ref $self );
+    return uniq @methods;
 }
 
 
@@ -218,10 +215,13 @@ sub register_action_methods {
     #this is still not correct for some reason.
     my $namespace = $self->action_namespace($c);
 
-    # Uncomment as soon as you fix the tests :)
-    #if (!blessed($self) && $self eq $c && scalar(@methods)) {
-    #    $c->log->warn("Action methods found defined in your application class, $self. This is deprecated, please move them into a Root controller.");
-    #}
+    # FIXME - fugly
+    if (!blessed($self) && $self eq $c && scalar(@methods)) {
+        my @really_bad_methods = grep { ! /^_(DISPATCH|BEGIN|AUTO|ACTION|END)$/ } map { $_->name } @methods;
+        if (scalar(@really_bad_methods)) {
+            $c->log->warn("Action methods (" . join(', ', @really_bad_methods) . ") found defined in your application class, $self. This is deprecated, please move them into a Root controller.");
+        }
+    }
 
     foreach my $method (@methods) {
         my $name = $method->name;
@@ -255,9 +255,15 @@ sub create_action {
     my $class = (exists $args{attributes}{ActionClass}
                     ? $args{attributes}{ActionClass}[0]
                     : $self->_action_class);
-
     Class::MOP::load_class($class);
-    return $class->new( \%args );
+
+    my $action_args = $self->config->{action_args};
+    my %extra_args = (
+        %{ $action_args->{'*'}           || {} },
+        %{ $action_args->{ $args{name} } || {} },
+    );
+
+    return $class->new({ %extra_args, %args });
 }
 
 sub _parse_attrs {
@@ -440,6 +446,35 @@ of setting namespace to '' (the null string).
 
 Sets 'path_prefix', as described below.
 
+=head2 action_args
+
+Allows you to set instantiation arguments on your custom Actions or ActionRoles.
+You can set args globally (shared across all actions) and specifically (for a
+single action).
+
+    package MyApp::Web::Controller::MyController;
+    use parent 'Catalyst::Controller';    
+
+    __PACKAGE__->config({
+        action_args => {
+            '*' => {globalarg1=>'hello', globalarg2=>'goodbye'},
+            'specific_action' => {customarg=>'arg1'},
+        },      
+     });
+    
+    sub specific_action :Path('') ActionClass('CustomActionClass') {}
+    
+    1;
+
+In the case above, your 'CustomActionClass' would get passed the following
+arguments when it is instantiated: (globalarg1=>'hello', globalarg2=>'goodbye',
+'customarg=>'arg1').  Please note that the order the arguments are passed are not
+certain to be in the order declared.
+
+As with all other configuration hashes, you can set values inline with your
+controller (as above) or centrally via a configuration file (such as you might
+use with the ConfigLoader plugin).
+
 =head1 METHODS
 
 =head2 BUILDARGS ($app, @args)