X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=1d91b3ccf6b9d4df31eb05c0c28511e63e031a74;hb=9563d3701ebb2e6a4ac4760ab84af6eb3ab7adc2;hp=028737f6c5937ae45c0a4432f0da920d19f8bbae;hpb=362c4f797541e899f48034811ae7d134c746b003;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index 028737f..1d91b3c 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -2,7 +2,7 @@ package Catalyst::Controller; 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/; } @@ -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,26 +25,26 @@ has action_namespace => ( is => 'rw', isa => 'Str', - init_arg => 'namespace', # 5.7 compat + init_arg => 'namespace', predicate => 'has_action_namespace', ); -has _controller_actions => +has actions => ( - is => 'rw', + accessor => '_controller_actions', 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 @@ -137,28 +137,30 @@ 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"); } } } - my $namespace = Catalyst::Utils::class2prefix(ref($self) || $self, $case_s) || ''; + my $namespace = Catalyst::Utils::class2prefix($self->catalyst_component_name, $case_s) || ''; $self->$orig($namespace) if ref($self); return $namespace; }; @@ -179,14 +181,29 @@ 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'); + my $meta = find_meta($self) || confess("No metaclass setup for $self"); + confess("Metaclass " + . 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; - return @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 ) ) + } keys %{ $self->_controller_actions } + ) if ( ref $self ); + return uniq @methods; } + sub register_actions { my ( $self, $c ) = @_; $self->register_action_methods( $c, $self->get_action_methods ); @@ -194,14 +211,21 @@ sub register_actions { sub register_action_methods { my ( $self, $c, @methods ) = @_; - my $class = ref $self || $self; + my $class = $self->catalyst_component_name; #this is still not correct for some reason. my $namespace = $self->action_namespace($c); + # 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; 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 +396,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 +500,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