X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=b4b89c2452fcce24c8554dfc554708966e596e62;hb=68c372d12e2504a6cf271f49810634c823c9c5d5;hp=f1f6e75f068b57dd13f5b7d148f940077d19fb88;hpb=f73d6ce28bc1c50abc27b50d52a965bdc002a748;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index f1f6e75..b4b89c2 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -9,7 +9,10 @@ use List::Util qw/first/; 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; @@ -117,7 +120,7 @@ for more info about how Catalyst dispatches to actions. =cut #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 +#to be class data. i think that attributes +default would work just fine __PACKAGE__->mk_classdata($_) for qw/_dispatch_steps _action_class _action_role_prefix/; __PACKAGE__->_dispatch_steps( [qw/_BEGIN _AUTO _ACTION/] ); @@ -317,7 +320,7 @@ sub action_class { ? $args{attributes}{ActionClass}[0] : $self->_action_class); - Class::MOP::load_class($class); + load_class($class); return $class; } @@ -365,7 +368,11 @@ sub gather_default_action_roles { my @roles = (); push @roles, 'Catalyst::ActionRole::HTTPMethods' if $args{attributes}->{Method}; - return @roles; + + push @roles, 'Catalyst::ActionRole::ConsumesContent' + if $args{attributes}->{Consumes}; + + return @roles; } sub _parse_attrs { @@ -740,18 +747,18 @@ Handle various types of paths: ... 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 Use Chained methods or other techniques. If you really depend on this, install the standalone L distribution. @@ -761,7 +768,7 @@ A global way to match a give regular expression in the incoming request path. =head2 LocalRegexp -Status: Deprecated. Use Chained methods or other techniques. +B Use Chained methods or other techniques. If you really depend on this, install the standalone L distribution. @@ -827,6 +834,61 @@ When used with L indicates the number of arguments expected in the path. However if no Args value is set, assumed to 'slurp' all remaining path pars under this namespace. +=head2 Consumes('...') + +Matches the current action against the content-type of the request. Typically +this is used when the request is a POST or PUT and you want to restrict the +submitted content type. For example, you might have an HTML for that either +returns classic url encoded form data, or JSON when Javascript is enabled. In +this case you may wish to match either incoming type to one of two different +actions, for properly processing. + +Examples: + + sub is_json : Chained('start') Consumes('application/json') { ... } + sub is_urlencoded : Chained('start') Consumes('application/x-www-form-urlencoded') { ... } + sub is_multipart : Chained('start') Consumes('multipart/form-data') { ... } + +To reduce boilerplate, we include the following content type shortcuts: + +Examples + + sub is_json : Chained('start') Consume(JSON) { ... } + sub is_urlencoded : Chained('start') Consumes(UrlEncoded) { ... } + sub is_multipart : Chained('start') Consumes(Multipart) { ... } + +You may specify more than one match: + + sub is_more_than_one + : Chained('start') + : Consumes('application/x-www-form-urlencoded') + : Consumes('multipart/form-data') + + sub is_more_than_one + : Chained('start') + : Consumes(UrlEncoded) + : Consumes(Multipart) + +Since it is a common case the shortcut C matches both +'application/x-www-form-urlencoded' and 'multipart/form-data'. Here's the full +list of available shortcuts: + + JSON => 'application/json', + JS => 'application/javascript', + PERL => 'application/perl', + HTML => 'text/html', + XML => 'text/XML', + Plain => 'text/plain', + UrlEncoded => 'application/x-www-form-urlencoded', + Multipart => 'multipart/form-data', + HTMLForm => ['application/x-www-form-urlencoded','multipart/form-data'], + +Please keep in mind that when dispatching, L will match the first most +relevent case, so if you use the C attribute, you should place your +most accurate matches early in the Chain, and your 'catchall' actions last. + +See L for more. + =head1 OPTIONAL METHODS =head2 _parse_[$name]_attr