X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=b1c4c945da3282e02b79cf0323582e0f8d23b208;hb=8f076801b5c41543fdc20859452ed2cea1e1f82f;hp=c738f9ee309c369dc56a1edf24a6c8856821817d;hpb=cea3f28ab5be5ba72557325c49fe684eb18e627d;p=catagits%2FCatalyst-Runtime.git
diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm
index c738f9e..b1c4c94 100644
--- a/lib/Catalyst/Controller.pm
+++ b/lib/Catalyst/Controller.pm
@@ -225,7 +225,9 @@ sub register_action_methods {
foreach my $method (@methods) {
my $name = $method->name;
- my $attributes = $method->attributes;
+ # Horrible hack! All method metaclasses should have an attributes
+ # method, core Moose bug - see r13354.
+ my $attributes = $method->can('attributes') ? $method->attributes : [];
my $attrs = $self->_parse_attrs( $c, $name, @{ $attributes } );
if ( $attrs->{Private} && ( keys %$attrs > 1 ) ) {
$c->log->debug( 'Bad action definition "'
@@ -248,16 +250,25 @@ sub register_action_methods {
}
}
-sub create_action {
+sub action_class {
my $self = shift;
my %args = @_;
my $class = (exists $args{attributes}{ActionClass}
- ? $args{attributes}{ActionClass}[0]
- : $self->_action_class);
+ ? $args{attributes}{ActionClass}[0]
+ : $self->_action_class);
+
Class::MOP::load_class($class);
+ return $class;
+}
+
+sub create_action {
+ my $self = shift;
+ my %args = @_;
+ my $class = $self->action_class(%args);
my $action_args = $self->config->{action_args};
+
my %extra_args = (
%{ $action_args->{'*'} || {} },
%{ $action_args->{ $args{name} } || {} },
@@ -446,22 +457,45 @@ of setting namespace to '' (the null string).
Sets 'path_prefix', as described below.
+=head2 action
+
+Allows you to set the attributes that the dispatcher creates actions out of.
+This allows you to do 'rails style routes', or override some of the
+attribute defintions of actions composed from Roles.
+You can set arguments globally (for all actions of the controller) and
+specifically (for a single action).
+
+ __PACKAGE__->config(
+ action => {
+ '*' => { Chained => 'base', Args => 0 },
+ base => { Chained => '/', PathPart => '', CaptureArgs => 0 },
+ },
+ );
+
+In the case above every sub in the package would be made into a Chain
+endpoint with a URI the same as the sub name for each sub, chained
+to the sub named C. Ergo dispatch to C would call the
+C method, then the C method.
+
=head2 action_args
-Allows you to set constructor arguments on your Actions or ActionRoles. You can
-set args globally (all actions of the controller) and specifically (for a single
-action).
+Allows you to set constructor arguments on your actions. You can set arguments
+globally and specifically (as above).
+This is particularly useful when using Cs
+(L) and custom Ces.
- __PACKAGE__->config({
+ __PACKAGE__->config(
action_args => {
- '*' => {globalarg1=>'hello', globalarg2=>'goodbye'},
- 'specific_action' => {customarg=>'arg1'},
+ '*' => { globalarg1 => 'hello', globalarg2 => 'goodbye' },
+ 'specific_action' => { customarg => 'arg1' },
},
- });
+ );
+
+In the case above the action class associated with C would get
+passed the following arguments, in addition to the normal action constructor
+arguments, when it is instantiated:
-In the case above the action class associated with 'specific_action' would get
-passed the following arguments when it is instantiated: (globalarg1=>'hello',
-globalarg2=>'goodbye', 'customarg=>'arg1').
+ (globalarg1 => 'hello', globalarg2 => 'goodbye', customarg => 'arg1')
=head1 METHODS
@@ -506,6 +540,11 @@ action methods for this package.
Creates action objects for a set of action methods using C< create_action >,
and registers them with the dispatcher.
+=head2 $self->action_class(%args)
+
+Used when a controller is creating an action to determine the correct base
+action class to use.
+
=head2 $self->create_action(%args)
Called with a hash of data to be use for construction of a new