X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=ee39c7b86b2db48a909dd13007b584ac8f8f8f5a;hb=c813664857bab8bd99687041937b078b9590bf0c;hp=3f79106397f87872e9808b80b20f66ed38b9a820;hpb=f3c5b1c9ec3109944760a437e6d26adb989ab62b;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index 3f79106..ee39c7b 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/; } @@ -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, ); @@ -44,6 +44,8 @@ sub BUILD { $self->_controller_actions($attr_value); } + + =head1 NAME Catalyst::Controller - Catalyst Controller base class @@ -135,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($self->_component_name, $case_s) || ''; + my $namespace = Catalyst::Utils::class2prefix($self->catalyst_component_name, $case_s) || ''; $self->$orig($namespace) if ref($self); return $namespace; }; @@ -177,8 +181,8 @@ around path_prefix => sub { sub get_action_methods { my $self = shift; - my $meta = find_meta($self); - confess("Metaclass for " + my $meta = find_meta($self) || confess("No metaclass setup for $self"); + confess("Metaclass " . ref($meta) . " for " . $meta->name . " cannot support register_actions." ) @@ -196,7 +200,7 @@ sub get_action_methods { . ( ref $self ) ) } keys %{ $self->_controller_actions } ) if ( ref $self ); - return @methods; + return uniq @methods; } @@ -207,7 +211,7 @@ sub register_actions { sub register_action_methods { my ( $self, $c, @methods ) = @_; - my $class = $self->_component_name; + my $class = $self->catalyst_component_name; #this is still not correct for some reason. my $namespace = $self->action_namespace($c); @@ -251,9 +255,15 @@ sub create_action { my $class = (exists $args{attributes}{ActionClass} ? $args{attributes}{ActionClass}[0] : $self->_action_class); - Class::MOP::load_class($class); - return $class->new( \%args ); + + my $action_args = $self->config->{action_args}; + my %extra_args = ( + %{ $action_args->{'*'} || {} }, + %{ $action_args->{ $args{name} } || {} }, + ); + + return $class->new({ %extra_args, %args }); } sub _parse_attrs { @@ -436,6 +446,35 @@ of setting namespace to '' (the null string). Sets 'path_prefix', as described below. +=head2 action_args + +Allows you to set instantiation arguments on your custom Actions or ActionRoles. +You can set args globally (shared across all actions) and specifically (for a +single action). + + package MyApp::Web::Controller::MyController; + use parent 'Catalyst::Controller'; + + __PACKAGE__->config({ + action_args => { + '*' => {globalarg1=>'hello', globalarg2=>'goodbye'}, + 'specific_action' => {customarg=>'arg1'}, + }, + }); + + sub specific_action :Path('') ActionClass('CustomActionClass') {} + + 1; + +In the case above, your 'CustomActionClass' would get passed the following +arguments when it is instantiated: (globalarg1=>'hello', globalarg2=>'goodbye', +'customarg=>'arg1'). Please note that the order the arguments are passed are not +certain to be in the order declared. + +As with all other configuration hashes, you can set values inline with your +controller (as above) or centrally via a configuration file (such as you might +use with the ConfigLoader plugin). + =head1 METHODS =head2 BUILDARGS ($app, @args)