Pull a bunch of gross hacks to get actions => { '*' => ... } working again
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Controller.pm
index 27b5d0f..cf6157a 100644 (file)
@@ -182,11 +182,10 @@ around path_prefix => sub {
 sub get_action_methods {
     my $self = shift;
     my $meta = find_meta($self) || confess("No metaclass setup for $self");
-    confess("Metaclass "
-          . ref($meta) . " for "
-          . $meta->name
-          . " cannot support register_actions." )
-      unless $meta->can('get_nearest_methods_with_attributes');
+    confess(
+        sprintf "Metaclass %s for %s cannot support register_actions.",
+            ref $meta, $meta->name,
+    ) unless $meta->can('get_nearest_methods_with_attributes');
     my @methods = $meta->get_nearest_methods_with_attributes;
 
     # actions specified via config are also action_methods
@@ -194,10 +193,14 @@ sub get_action_methods {
         @methods,
         map {
             $meta->find_method_by_name($_)
-              || confess( 'Action "'
-                  . $_
-                  . '" is not available from controller '
-                  . ( ref $self ) )
+                || confess( sprintf 'Action "%s" is not available from controller %s',
+                            $_, ref $self )
+          } grep {
+              # '*' is a special action configuration key to apply config to all
+              # actions. It's not to be looked up as a method
+              # name. _controller_actions should probably be cleaned up before
+              # we even get here.
+              $_ ne '*'
           } keys %{ $self->_controller_actions }
     ) if ( ref $self );
     return uniq @methods;
@@ -296,11 +299,6 @@ sub _parse_attrs {
         }
     }
 
-    #I know that the original behavior was to ignore action if actions was set
-    # but i actually think this may be a little more sane? we can always remove
-    # the merge behavior quite easily and go back to having actions have
-    # presedence over action by modifying the keys. i honestly think this is
-    # superior while mantaining really high degree of compat
     my $actions;
     if( ref($self) ) {
         $actions = $self->_controller_actions;
@@ -309,10 +307,21 @@ sub _parse_attrs {
         $actions = $self->merge_config_hashes($cfg->{actions}, $cfg->{action});
     }
 
-    %raw_attributes = ((exists $actions->{'*'} ? %{$actions->{'*'}} : ()),
-                       %raw_attributes,
-                       (exists $actions->{$name} ? %{$actions->{$name}} : ()));
+    %raw_attributes = (
+        %raw_attributes,
+        exists $actions->{$name} ? %{ $actions->{$name } } : (),
+    );
 
+    # Private actions with additional attributes will raise a warning and then
+    # be ignored. Adding '*' arguments to the default _DISPATCH / etc. methods,
+    # which are Private, will prevent those from being registered. They should
+    # probably be turned into :Actions instead, or we might want to otherwise
+    # disambiguate between those built-in internal actions and user-level
+    # Private ones.
+    %raw_attributes = (
+        (exists $actions->{'*'} ? %{ $actions->{'*'} } : ()),
+        %raw_attributes,
+    ) unless $raw_attributes{Private};
 
     my %final_attributes;
 
@@ -543,7 +552,7 @@ and registers them with the dispatcher.
 =head2 $self->action_class(%args)
 
 Used when a controller is creating an action to determine the correct base
-action class to use.  
+action class to use.
 
 =head2 $self->create_action(%args)