#this is still not correct for some reason.
my $namespace = $self->action_namespace($c);
+ # FIXME - fugly
if (!blessed($self) && $self eq $c && scalar(@methods)) {
- $c->log->warn("Action methods found defined in your application class, $self. This is deprecated, please move them into a Root controller.");
+ 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 $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 {
Sets 'path_prefix', as described below.
+=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).
+
+ __PACKAGE__->config({
+ action_args => {
+ '*' => {globalarg1=>'hello', globalarg2=>'goodbye'},
+ 'specific_action' => {customarg=>'arg1'},
+ },
+ });
+
+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').
+
=head1 METHODS
=head2 BUILDARGS ($app, @args)