X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Action-REST.git;a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FSerialize.pm;h=74e3af3b4e4fa8d6ed19f092600339f05e0b56d6;hp=38dbc4375083427d252316c450e1d8c653f4c274;hb=3bb36dcaabf34fef5c15b1bb74c5eb198a7f5168;hpb=9cd203c9c0d7099ff38fb9e1132459d76d19a360 diff --git a/lib/Catalyst/Action/Serialize.pm b/lib/Catalyst/Action/Serialize.pm index 38dbc43..74e3af3 100644 --- a/lib/Catalyst/Action/Serialize.pm +++ b/lib/Catalyst/Action/Serialize.pm @@ -1,18 +1,21 @@ -# -# Catlyst::Action::Serialize.pm -# Created by: Adam Jacob, Marchex, -# -# $Id$ - package Catalyst::Action::Serialize; -use strict; -use warnings; +use Moose; +use namespace::autoclean; -use base 'Catalyst::Action::SerializeBase'; +extends 'Catalyst::Action::SerializeBase'; use Module::Pluggable::Object; use MRO::Compat; +our $VERSION = '0.82'; +$VERSION = eval $VERSION; + +has _encoders => ( + is => 'ro', + isa => 'HashRef', + default => sub { {} }, +); + sub execute { my $self = shift; my ( $controller, $c ) = @_; @@ -39,22 +42,27 @@ sub execute { $c->log->debug( "Serializing with $sclass" . ( $sarg ? " [$sarg]" : '' ) ) if $c->debug; + $self->_encoders->{$sclass} ||= $sclass->new; + my $sobj = $self->_encoders->{$sclass}; + my $rc; - if ( defined($sarg) ) { - $rc = $sclass->execute( $controller, $c, $sarg ); - } else { - $rc = $sclass->execute( $controller, $c ); - } - if ( $rc eq 0 ) { + eval { + if ( defined($sarg) ) { + $rc = $sobj->execute( $controller, $c, $sarg ); + } else { + $rc = $sobj->execute( $controller, $c ); + } + }; + if ($@) { + return $self->_serialize_bad_request( $c, $content_type, $@ ); + } elsif (!$rc) { return $self->_unsupported_media_type( $c, $content_type ); - } elsif ( $rc ne 1 ) { - return $self->_serialize_bad_request( $c, $content_type, $rc ); } return 1; } -1; +__PACKAGE__->meta->make_immutable; =head1 NAME @@ -108,7 +116,7 @@ Takes a hashref, mapping Content-Types to a given serializer plugin. This is the 'fall-back' Content-Type if none of the requested or acceptable types is found in the L. It must be an entry in the L. -=head2 stash_key +=head2 stash_key Specifies the key of the stash entry holding the data that is to be serialized. So if the value is "rest", we will serialize the data under: @@ -128,7 +136,7 @@ perhaps for debugging. Daisuke Maki pointed out that early versions of this Action did not play well with others, or generally behave in a way that was very consistent -with the rest of Catalyst. +with the rest of Catalyst. =head1 SEE ALSO @@ -137,11 +145,9 @@ a sensible set of defaults for doing a REST controller. L, L -=head1 AUTHOR - -Adam Jacob , with lots of help from mst and jrockway +=head1 AUTHORS -Marchex, Inc. paid me while I developed this module. (http://www.marchex.com) +See L for authors. =head1 LICENSE