X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FDeserialize.pm;h=29f461fe37ee2f8cba41221fb5072d96c906e791;hb=44fa7f9429568532ea892e2020c20177b71cb736;hp=b87e236a35f1a4df65e1fc82daf4eea97b604f81;hpb=588cbecc2334772603c4ac41133e7a3b446027ee;p=catagits%2FCatalyst-Action-REST.git diff --git a/lib/Catalyst/Action/Deserialize.pm b/lib/Catalyst/Action/Deserialize.pm index b87e236..29f461f 100644 --- a/lib/Catalyst/Action/Deserialize.pm +++ b/lib/Catalyst/Action/Deserialize.pm @@ -6,18 +6,26 @@ use namespace::autoclean; extends 'Catalyst::Action::SerializeBase'; use Module::Pluggable::Object; use MRO::Compat; +use Moose::Util::TypeConstraints; -our $VERSION = '0.90'; +our $VERSION = '1.04'; $VERSION = eval $VERSION; has plugins => ( is => 'rw' ); has deserialize_http_methods => ( - traits => ['Array'], - isa => 'ArrayRef[Str]', + traits => ['Hash'], + isa => do { + my $tc = subtype as 'HashRef[Str]'; + coerce $tc, from 'ArrayRef[Str]', + via { +{ map { ($_ => 1) } @$_ } }; + $tc; + }, + coerce => 1, builder => '_build_deserialize_http_methods', handles => { - deserialize_http_methods => 'elements', + deserialize_http_methods => 'keys', + _deserialize_handles_http_method => 'exists', }, ); @@ -27,8 +35,7 @@ sub execute { my $self = shift; my ( $controller, $c ) = @_; - my $method = $c->request->method; - if ( grep /^$method$/, $self->deserialize_http_methods ) { + if ( !defined($c->req->data) && $self->_deserialize_handles_http_method($c->request->method) ) { my ( $sclass, $sarg, $content_type ) = $self->_load_content_plugins( 'Catalyst::Action::Deserialize', $controller, $c ); @@ -40,9 +47,9 @@ sub execute { $rc = $sclass->execute( $controller, $c ); } if ( $rc eq "0" ) { - return $self->_unsupported_media_type( $c, $content_type ); + return $self->unsupported_media_type( $c, $content_type ); } elsif ( $rc ne "1" ) { - return $self->_serialize_bad_request( $c, $content_type, $rc ); + return $self->serialize_bad_request( $c, $content_type, $rc ); } } @@ -113,6 +120,13 @@ Will work just fine. When you use this module, the request class will be changed to L. +=head1 CUSTOM ERRORS + +For building custom error responses when de-serialization fails, you can create +an ActionRole (and use L to apply it to the +C action) which overrides C and/or C<_serialize_bad_request> +methods. + =head1 SEE ALSO You likely want to look at L, which implements