. $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 {
+ # 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) {
$meta->find_method_by_name($_)
|| confess( 'Action "'
. $_
. '" is not available from controller '
- . ( ref $self ) )
- } keys %{ $self->_controller_actions }
- ) if ( ref $self );
- return @methods;
+ . ( ref $self ) );
+ }
+ }
+ return keys %methods;
}
--- /dev/null
+use strict;
+use warnings;
+use Test::More tests => 4;
+
+use Catalyst ();
+{
+ package TestController;
+ use Moose;
+ BEGIN { extends 'Catalyst::Controller' }
+
+ sub action : Local {}
+
+ sub foo : Path {}
+
+ no Moose;
+}
+
+my $mock_app = Class::MOP::Class->create_anon_class( superclasses => ['Catalyst'] );
+my $app = $mock_app->name->new;
+my $controller = TestController->new($app, {actions => { foo => { Path => '/some/path' }}});
+
+ok $controller->can('_controller_actions');
+is_deeply $controller->_controller_actions => { foo => { Path => '/some/path' }};
+is_deeply $controller->{actions} => { foo => { Path => '/some/path' }}; # Back compat.
+is_deeply [ sort grep { ! /^_/ } $controller->get_action_methods ], [sort qw/action foo/];
+