use Class::Load ':all';
use String::RewritePrefix;
use Moose::Util qw/find_meta/;
-use List::Util qw/first/;
-use List::MoreUtils qw/uniq/;
+use List::Util qw/first uniq/;
use namespace::clean -except => 'meta';
BEGIN {
my ( $self, $c ) = @_;
my @auto = $c->get_actions( 'auto', $c->namespace );
foreach my $auto (@auto) {
+ # We FORCE the auto action user to explicitly return
+ # true. We need to do this since there's some auto
+ # users (Catalyst::Authentication::Credential::HTTP) that
+ # actually do a detach instead.
+ $c->state(0);
$auto->dispatch( $c );
return 0 unless $c->state;
}
# Parse out :Foo(bar) into Foo => bar etc (and arrayify)
- if ( my ( $key, $value ) = ( $attr =~ /^(.*?)(?:\(\s*(.+?)\s*\))?$/ ) )
+ if ( my ( $key, $value ) = ( $attr =~ /^(.*?)(?:\(\s*(.+?)?\s*\))?$/ ) )
{
if ( defined $value ) {
From L<Catalyst::Component::ApplicationAttribute>, stashes the application
instance as $self->_application.
-=head2 $self->action_for('name')
+=head2 $self->action_for($action_name)
-Returns the Catalyst::Action object (if any) for a given method name
-in this component.
+Returns the Catalyst::Action object (if any) for a given action in this
+controller or relative to it. You may refer to actions in controllers
+nested under the current controllers namespace, or in controllers 'up'
+from the current controller namespace. For example:
+
+ package MyApp::Controller::One::Two;
+ use base 'Catalyst::Controller';
+
+ sub foo :Local {
+ my ($self, $c) = @_;
+ $self->action_for('foo'); # action 'foo' in Controller 'One::Two'
+ $self->action_for('three/bar'); # action 'bar' in Controller 'One::Two::Three'
+ $self->action_for('../boo'); # action 'boo' in Controller 'One'
+ }
+
+This returns 'undef' if there is no action matching the requested action
+name (after any path normalization) so you should check for this as needed.
=head2 $self->action_namespace($c)
package MyApp::Controller::Zoo;
- sub foo : Local Does('Moo') { ... } # Catalyst::ActionRole::
- sub bar : Local Does('~Moo') { ... } # MyApp::ActionRole::Moo
- sub baz : Local Does('+MyApp::ActionRole::Moo') { ... }
+ sub foo : Local Does('Buzz') { ... } # Catalyst::ActionRole::
+ sub bar : Local Does('~Buzz') { ... } # MyApp::ActionRole::Buzz
+ sub baz : Local Does('+MyApp::ActionRole::Buzz') { ... }
=head2 GET
See L<Catalyst::RouteMatching> for more.
+B<Note>: It is highly recommended to use L<Type::Tiny> for your type constraints over
+other options. L<Type::Tiny> exposed a better meta data interface which allows us to
+do more and better types of introspection driving tests and debugging.
+
=head2 Consumes('...')
Matches the current action against the content-type of the request. Typically