X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=69244057f7773e2478288ef8d6045ebfae592677;hb=a8f4e833e16a5d2f034afbaf3a94ecdb475ec9cb;hp=028737f6c5937ae45c0a4432f0da920d19f8bbae;hpb=362c4f797541e899f48034811ae7d134c746b003;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index 028737f..6924405 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -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 @@ -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->get_method($_) + || 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 ); @@ -201,7 +214,6 @@ sub register_action_methods { 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 "' @@ -378,9 +390,7 @@ sub _parse_PathPrefix_attr { sub _parse_ActionClass_attr { my ( $self, $c, $name, $value ) = @_; - unless ( $value =~ s/^\+// ) { - $value = join('::', $self->_action_class, $value ); - } + $value = Catalyst::Utils::resolve_namespace($self->_action_class, $value); return ( 'ActionClass', $value ); }