use List::MoreUtils qw/uniq/;
use namespace::clean -except => 'meta';
-BEGIN { extends qw/Catalyst::Component MooseX::MethodAttributes::Inheritable/; }
+BEGIN {
+ extends qw/Catalyst::Component/;
+ with qw/MooseX::MethodAttributes::Role::AttrContainer::Inheritable/;
+}
use MooseX::MethodAttributes;
use Catalyst::Exception;
? $args{attributes}{ActionClass}[0]
: $self->_action_class);
- Class::MOP::load_class($class);
+ load_class($class);
return $class;
}
unless ($args{name} =~ /^_(DISPATCH|BEGIN|AUTO|ACTION|END)$/) {
my @roles = $self->gather_action_roles(%args);
+ push @roles, $self->gather_default_action_roles(%args);
+
$class = $self->_apply_action_class_roles($class, @roles) if @roles;
}
sub gather_action_roles {
my ($self, %args) = @_;
-
return (
(blessed $self ? $self->_action_roles : ()),
@{ $args{attributes}->{Does} || [] },
);
}
+sub gather_default_action_roles {
+ my ($self, %args) = @_;
+ my @roles = ();
+ push @roles, 'Catalyst::ActionRole::HTTPMethods'
+ if $args{attributes}->{Method};
+ return @roles;
+}
+
sub _parse_attrs {
my ( $self, $c, $name, @attrs ) = @_;
}
}
-sub _parse_Regex_attr {
- my ( $self, $c, $name, $value ) = @_;
- return ( 'Regex', $value );
-}
-
-sub _parse_Regexp_attr { shift->_parse_Regex_attr(@_); }
-
-sub _parse_LocalRegex_attr {
- my ( $self, $c, $name, $value ) = @_;
- unless ( $value =~ s/^\^// ) { $value = "(?:.*?)$value"; }
-
- my $prefix = $self->path_prefix( $c );
- $prefix .= '/' if length( $prefix );
-
- return ( 'Regex', "^${prefix}${value}" );
-}
-
-sub _parse_LocalRegexp_attr { shift->_parse_LocalRegex_attr(@_); }
-
sub _parse_Chained_attr {
my ($self, $c, $name, $value) = @_;
return Does => $self->_expand_role_shortname($value);
}
-sub _parse_GET_attr { Method => 'GET' }
-sub _parse_POST_attr { Method => 'POST' }
-sub _parse_PUT_attr { Method => 'PUT' }
+sub _parse_GET_attr { Method => 'GET' }
+sub _parse_POST_attr { Method => 'POST' }
+sub _parse_PUT_attr { Method => 'PUT' }
sub _parse_DELETE_attr { Method => 'DELETE' }
sub _parse_OPTION_attr { Method => 'OPTION' }
-sub _parse_HEAD_attr { Method => 'HEAD' }
+sub _parse_HEAD_attr { Method => 'HEAD' }
sub _expand_role_shortname {
my ($self, @shortnames) = @_;
=head2 $self->path_prefix($c)
-Returns the default path prefix for :PathPrefix, :Local, :LocalRegex and
+Returns the default path prefix for :PathPrefix, :Local and
relative :Path actions in this component. Defaults to the action_namespace or
can be overridden from the "path" config key.
Gathers the list of roles to apply to an action with the given %action_args.
+=head2 $self->gather_default_action_roles(\%action_args)
+
+returns a list of action roles to be applied based on core, builtin rules.
+Currently only the L<Catalyst::ActionRole::HTTPMethods> role is applied
+this way.
+
=head2 $self->_application
=head2 $self->_app
Generally L<Catalyst> uses these to influence how the dispatcher sees your
action and when it will run it in response to an incoming request. They can
also be used for other things. Here's a summary, but you should refer to the
-liked manual page for additional help.
+linked manual page for additional help.
=head2 Global
...
sub myaction1 :Path { ... } # -> /baz
- sub myaction2 :Path('foo') { ... } # -> /baz/bar
+ sub myaction2 :Path('foo') { ... } # -> /baz/foo
sub myaction2 :Path('/bar') { ... } # -> /bar
}
-This is a general toolbox for attaching your action to a give path.
+This is a general toolbox for attaching your action to a given path.
=head2 Regex
=head2 Regexp
-Status: Deprecated. Use Chained methods or other techniques
+B<Status: Deprecated.> Use Chained methods or other techniques.
+If you really depend on this, install the standalone
+L<Catalyst::DispatchType::Regex> distribution.
A global way to match a give regular expression in the incoming request path.
=head2 LocalRegexp
+B<Status: Deprecated.> Use Chained methods or other techniques.
+If you really depend on this, install the standalone
+L<Catalyst::DispatchType::Regex> distribution.
+
Like L</Regex> but scoped under the namespace of the containing controller
=head2 Chained
=head2 MyAction
-Set the ActionClass using a custom Action in your project namespace (such as
-C<MyApp::Action::MyAction> => MyAction('MyAction').
+Set the ActionClass using a custom Action in your project namespace.
+
+The following is exactly the same:
+
+ sub foo_action1 : Local ActionClass('+MyApp::Action::Bar') { ... }
+ sub foo_action2 : Local MyAction('Bar') { ... }
=head2 Does
=head2 HEAD
-Sets the give action path to match the specified HTTP method.
+=head2 PATCH
+
+=head2 Method('...')
+
+Sets the give action path to match the specified HTTP method, or via one of the
+broadly accepted methods of overriding the 'true' method (see
+L<Catalyst::ActionRole::HTTPMethods>).
=head2 Args