X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction%2FSerializeBase.pm;h=8ba1100f3ed1d16ddd0b23450d026ab0efb60fbe;hb=0e1381b4a58f89c8764463ee71f089f4c65ca081;hp=546f49a76b579f549f5721fb126a0cef084271d7;hpb=367b3ff4e4444df4d20e8688c1cad9e1f59a3ba5;p=catagits%2FCatalyst-Action-REST.git diff --git a/lib/Catalyst/Action/SerializeBase.pm b/lib/Catalyst/Action/SerializeBase.pm index 546f49a..8ba1100 100644 --- a/lib/Catalyst/Action/SerializeBase.pm +++ b/lib/Catalyst/Action/SerializeBase.pm @@ -1,23 +1,23 @@ -# -# Catlyst::Action::SerializeBase.pm -# Created by: Adam Jacob, Marchex, -# -# $Id$ - package Catalyst::Action::SerializeBase; -use strict; -use warnings; +use Moose; +use namespace::autoclean; -use base 'Catalyst::Action'; +extends 'Catalyst::Action'; use Module::Pluggable::Object; -use Data::Dump qw(dump); use Catalyst::Request::REST; +use Catalyst::Utils (); + +our $VERSION = '0.96'; +$VERSION = eval $VERSION; -Catalyst->request_class('Catalyst::Request::REST') - unless Catalyst->request_class->isa('Catalyst::Request::REST'); +after BUILDARGS => sub { + my $class = shift; + my $config = shift; + Catalyst::Request::REST->_insert_self_into( $config->{class} ); +}; -__PACKAGE__->mk_accessors(qw(_serialize_plugins _loaded_plugins)); +has [qw(_serialize_plugins _loaded_plugins)] => ( is => 'rw' ); sub _load_content_plugins { my $self = shift; @@ -36,23 +36,52 @@ sub _load_content_plugins { $self->_serialize_plugins( \@plugins ); } - my $content_type = $c->request->preferred_content_type; - # Finally, we load the class. If you have a default serializer, # and we still don't have a content-type that exists in the map, # we'll use it. my $sclass = $search_path . "::"; my $sarg; - my $map = $controller->config->{'serialize'}->{'map'}; - - # If we don't have a handler for our preferred content type, try - # the default - if ( ! exists $map->{$content_type} ) { - if( exists $controller->config->{'serialize'}->{'default'} ) { - $content_type = $controller->config->{'serialize'}->{'default'} ; - } else { - return $self->_unsupported_media_type($c, $content_type); - } + my $map; + + my $config; + + if ( exists $controller->{'serialize'} ) { + $c->log->info("Catalyst::Action::REST - deprecated use of 'serialize' for configuration."); + $c->log->info("Please see 'CONFIGURATION' in Catalyst::Controller::REST."); + $config = $controller->{'serialize'}; + # if they're using the deprecated config, they may be expecting a + # default mapping too. + $config->{map} ||= $controller->{map}; + } else { + $config = $controller; + } + $map = $config->{'map'}; + + # pick preferred content type + my @accepted_types; # priority order, best first + # give top priority to content type specified by stash, if any + my $content_type_stash_key = $config->{content_type_stash_key}; + if ($content_type_stash_key + and my $stashed = $c->stash->{$content_type_stash_key} + ) { + # convert to array if not already a ref + $stashed = [ $stashed ] if not ref $stashed; + push @accepted_types, @$stashed; + } + # then content types requested by caller + push @accepted_types, @{ $c->request->accepted_content_types }; + # then the default + push @accepted_types, $config->{'default'} if $config->{'default'}; + # pick the best match that we have a serializer mapping for + my ($content_type) = grep { $map->{$_} } @accepted_types; + + return $self->_unsupported_media_type($c, $content_type) + if not $content_type; + + # carp about old text/x-json + if ($content_type eq 'text/x-json') { + $c->log->info('Using deprecated text/x-json content-type.'); + $c->log->info('Use application/json instead!'); } if ( exists( $map->{$content_type} ) ) { @@ -84,8 +113,7 @@ sub _load_content_plugins { eval { require $load_class; }; if ($@) { $c->log->error( - "Error loading $sclass for " . $content_type . ": $!" ) - if $c->log->is_debug; + "Error loading $sclass for " . $content_type . ": $!" ); return $self->_unsupported_media_type($c, $content_type); } else { $self->_loaded_plugins->{$sclass} = 1; @@ -127,13 +155,13 @@ sub _serialize_bad_request { return undef; } +__PACKAGE__->meta->make_immutable; + 1; =head1 NAME -B - -Base class for Catalyst::Action::Serialize and Catlayst::Action::Deserialize. +Catalyst::Action::SerializeBase - Base class for Catalyst::Action::Serialize and Catlayst::Action::Deserialize. =head1 DESCRIPTION @@ -145,15 +173,12 @@ code for L and L. L, 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 You may distribute this code under the same terms as Perl itself. =cut -