X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=d52ae3f8dbdf488d1591549ac6431cc327fe7e1c;hb=0da2dc3044ed62182fd3cf515b26c852edaa11b4;hp=972b6a3020b33a7f4819395fa26ac3b1b0d75d70;hpb=8f6cebb2303a0b0eda9422430f926c3f83c72aed;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index 972b6a3..d52ae3f 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -29,9 +29,9 @@ has action_namespace => predicate => 'has_action_namespace', ); -has _controller_actions => +has actions => ( - is => 'rw', + accessor => '_controller_actions', isa => 'HashRef', init_arg => undef, ); @@ -137,21 +137,23 @@ around action_namespace => sub { my $orig = shift; my ( $self, $c ) = @_; + my $class = ref($self) || $self; + my $appclass = ref($c) || $c; if( ref($self) ){ return $self->$orig if $self->has_action_namespace; } else { - return $self->config->{namespace} if exists $self->config->{namespace}; + return $class->config->{namespace} if exists $class->config->{namespace}; } my $case_s; if( $c ){ - $case_s = $c->config->{case_sensitive}; + $case_s = $appclass->config->{case_sensitive}; } else { if ($self->isa('Catalyst')) { - $case_s = $self->config->{case_sensitive}; + $case_s = $class->config->{case_sensitive}; } else { if (ref $self) { - $case_s = $self->_application->config->{case_sensitive}; + $case_s = ref($self->_application)->config->{case_sensitive}; } else { confess("Can't figure out case_sensitive setting"); } @@ -185,20 +187,23 @@ sub get_action_methods { . $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; }