X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=49591d3b64e24ea8586436d5c9f255d37d7c2e9d;hb=e9ba5c119a81f59f8339cd5c749709f5bc56b6d6;hp=ee39c7b86b2db48a909dd13007b584ac8f8f8f5a;hpb=c813664857bab8bd99687041937b078b9590bf0c;p=catagits%2FCatalyst-Runtime.git
diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm
index ee39c7b..49591d3 100644
--- a/lib/Catalyst/Controller.pm
+++ b/lib/Catalyst/Controller.pm
@@ -71,11 +71,14 @@ for more info about how Catalyst dispatches to actions.
#I think both of these could be attributes. doesn't really seem like they need
#to ble class data. i think that attributes +default would work just fine
-__PACKAGE__->mk_classdata($_) for qw/_dispatch_steps _action_class/;
+__PACKAGE__->mk_classdata($_) for qw/_dispatch_steps/;
__PACKAGE__->_dispatch_steps( [qw/_BEGIN _AUTO _ACTION/] );
-__PACKAGE__->_action_class('Catalyst::Action');
+has _action_class => (
+ is => 'rw',
+ default => 'Catalyst::Action',
+);
sub _DISPATCH : Private {
my ( $self, $c ) = @_;
@@ -248,14 +251,21 @@ sub register_action_methods {
}
}
-sub create_action {
- my $self = shift;
- my %args = @_;
+sub action_class {
+ my ($self, %args) = @_;
my $class = (exists $args{attributes}{ActionClass}
? $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 = (
@@ -446,34 +456,45 @@ of setting namespace to '' (the null string).
Sets 'path_prefix', as described below.
-=head2 action_args
+=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 },
+ },
+ );
-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).
+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.
- package MyApp::Web::Controller::MyController;
- use parent 'Catalyst::Controller';
+=head2 action_args
+
+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'},
- },
- });
-
- 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).
+ '*' => { 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:
+
+ (globalarg1 => 'hello', globalarg2 => 'goodbye', customarg => 'arg1')
=head1 METHODS