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/; }
predicate => 'has_action_namespace',
);
-has _controller_actions =>
+has actions =>
(
- is => 'rw',
+ accessor => '_controller_actions',
isa => 'HashRef',
init_arg => undef,
);
. $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;
}
#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;