Remove special-casing of '*' for get_action_methods
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Controller.pm
index ca94a3b..16b5a38 100644 (file)
@@ -36,15 +36,30 @@ has actions =>
      init_arg => undef,
     );
 
+# ->config(actions => { '*' => ...
+has _all_actions_attributes => (
+    is       => 'ro',
+    isa      => 'HashRef',
+    init_arg => undef,
+    lazy     => 1,
+    builder  => '_build__all_actions_attributes',
+);
+
 sub BUILD {
     my ($self, $args) = @_;
     my $action  = delete $args->{action}  || {};
     my $actions = delete $args->{actions} || {};
     my $attr_value = $self->merge_config_hashes($actions, $action);
     $self->_controller_actions($attr_value);
-}
 
+    # trigger lazy builder
+    $self->_all_actions_attributes;
+}
 
+sub _build__all_actions_attributes {
+    my ($self) = @_;
+    delete $self->_controller_actions->{'*'} || {};
+}
 
 =head1 NAME
 
@@ -195,7 +210,7 @@ sub get_action_methods {
             $meta->find_method_by_name($_)
                 || confess( sprintf 'Action "%s" is not available from controller %s',
                             $_, ref $self )
-          } keys %{ $self->_controller_actions }
+        } keys %{ $self->_controller_actions }
     ) if ( ref $self );
     return uniq @methods;
 }
@@ -293,18 +308,30 @@ sub _parse_attrs {
         }
     }
 
-    my $actions;
+    my ($actions_config, $all_actions_config);
     if( ref($self) ) {
-        $actions = $self->_controller_actions;
+        $actions_config = $self->_controller_actions;
+        # No, you're not getting actions => { '*' => ... } with actions in MyApp.
+        $all_actions_config = $self->_all_actions_attributes;
     } else {
         my $cfg = $self->config;
-        $actions = $self->merge_config_hashes($cfg->{actions}, $cfg->{action});
+        $actions_config = $self->merge_config_hashes($cfg->{actions}, $cfg->{action});
+        $all_actions_config = {};
     }
 
-    %raw_attributes = ((exists $actions->{'*'} ? %{$actions->{'*'}} : ()),
-                       %raw_attributes,
-                       (exists $actions->{$name} ? %{$actions->{$name}} : ()));
+    %raw_attributes = (
+        %raw_attributes,
+        exists $actions_config->{$name} ? %{ $actions_config->{$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 = (%{ $all_actions_config }, %raw_attributes)
+        unless $raw_attributes{Private};
 
     my %final_attributes;