Moved action methods from t/lib/TestApp.pm to t/lib/Test/Controller/Root.pm. Uncommen...
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Controller.pm
index 028737f..f23ad4a 100644 (file)
@@ -17,7 +17,7 @@ has path_prefix =>
     (
      is => 'rw',
      isa => 'Str',
-     init_arg => 'path', # 5.7 compat
+     init_arg => 'path',
      predicate => 'has_path_prefix',
     );
 
@@ -25,7 +25,7 @@ has action_namespace =>
     (
      is => 'rw',
      isa => 'Str',
-     init_arg => 'namespace', # 5.7 compat
+     init_arg => 'namespace',
      predicate => 'has_action_namespace',
     );
 
@@ -33,18 +33,16 @@ has _controller_actions =>
     (
      is => 'rw',
      isa => 'HashRef',
-     init_arg => 'action', # 5.7 compat
+     init_arg => undef,
     );
 
-around BUILDARGS => sub { # Icky 5.7 compat
-    my $orig = shift;
-    my $self = shift;
-    my $args = $self->$orig(@_);
+sub BUILD {
+    my ($self, $args) = @_;
     my $action  = delete $args->{action}  || {};
     my $actions = delete $args->{actions} || {};
-    $args->{action} = $self->merge_config_hashes($actions, $action);
-    return $args;
-};
+    my $attr_value = $self->merge_config_hashes($actions, $action);
+    $self->_controller_actions($attr_value);
+}
 
 =head1 NAME
 
@@ -158,7 +156,7 @@ around action_namespace => sub {
         }
     }
 
-    my $namespace = Catalyst::Utils::class2prefix(ref($self) || $self, $case_s) || '';
+    my $namespace = Catalyst::Utils::class2prefix($self->_component_name, $case_s) || '';
     $self->$orig($namespace) if ref($self);
     return $namespace;
 };
@@ -180,13 +178,28 @@ around path_prefix => sub {
 sub get_action_methods {
     my $self = shift;
     my $meta = find_meta($self);
-    confess("Metaclass for " . ref($meta) ." for " . $meta->name
-        . " cannot support register_actions.")
-        unless $meta->can('get_nearest_methods_with_attributes');
+    confess("Metaclass for "
+          . ref($meta) . " for "
+          . $meta->name
+          . " cannot support register_actions." )
+      unless $meta->can('get_nearest_methods_with_attributes');
     my @methods = $meta->get_nearest_methods_with_attributes;
+
+    # 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 ) )
+          } keys %{ $self->_controller_actions }
+    ) if ( ref $self );
     return @methods;
 }
 
+
 sub register_actions {
     my ( $self, $c ) = @_;
     $self->register_action_methods( $c, $self->get_action_methods );
@@ -194,14 +207,17 @@ sub register_actions {
 
 sub register_action_methods {
     my ( $self, $c, @methods ) = @_;
-    my $class = ref $self || $self;
+    my $class = $self->_component_name;
     #this is still not correct for some reason.
     my $namespace = $self->action_namespace($c);
 
+    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.");
+    }
+
     foreach my $method (@methods) {
         my $name = $method->name;
         my $attributes = $method->attributes;
-        next unless $attributes;
         my $attrs = $self->_parse_attrs( $c, $name, @{ $attributes } );
         if ( $attrs->{Private} && ( keys %$attrs > 1 ) ) {
             $c->log->debug( 'Bad action definition "'
@@ -372,15 +388,14 @@ sub _parse_ChainedParent_attr {
 }
 
 sub _parse_PathPrefix_attr {
-    my $self = shift;
-    return PathPart => $self->path_prefix;
+    my ( $self, $c ) = @_;
+    return PathPart => $self->path_prefix($c);
 }
 
 sub _parse_ActionClass_attr {
     my ( $self, $c, $name, $value ) = @_;
-    unless ( $value =~ s/^\+// ) {
-      $value = join('::', $self->_action_class, $value );
-    }
+    my $appname = $self->_application;
+    $value = Catalyst::Utils::resolve_namespace($appname . '::Action', $self->_action_class, $value);
     return ( 'ActionClass', $value );
 }
 
@@ -477,7 +492,7 @@ Catalyst Contributors, see Catalyst.pm
 
 =head1 COPYRIGHT
 
-This program is free software, you can redistribute it and/or modify
+This library is free software. You can redistribute it and/or modify
 it under the same terms as Perl itself.
 
 =cut