Rework ::XS serializer and deserializer classes
[catagits/Catalyst-Action-REST.git] / lib / Catalyst / Action / Serialize / JSON.pm
1 package Catalyst::Action::Serialize::JSON;
2
3 use Moose;
4 use namespace::autoclean;
5 BEGIN {
6     $ENV{'PERL_JSON_BACKEND'} = 2; # Always use compiled JSON::XS
7 }
8
9 extends 'Catalyst::Action';
10 use JSON ();
11
12 our $VERSION = '1.00';
13 $VERSION = eval $VERSION;
14
15 has encoder => (
16    is => 'ro',
17    lazy_build => 1,
18 );
19
20 sub _build_encoder {
21    my $self = shift;
22    return JSON->new->utf8->convert_blessed;
23 }
24
25 sub execute {
26     my $self = shift;
27     my ( $controller, $c ) = @_;
28
29     my $stash_key = (
30             $controller->{'serialize'} ?
31                 $controller->{'serialize'}->{'stash_key'} :
32                 $controller->{'stash_key'}
33         ) || 'rest';
34     my $output = $self->serialize( $c->stash->{$stash_key} );
35     $c->response->output( $output );
36     return 1;
37 }
38
39 sub serialize {
40     my $self = shift;
41     my $data = shift;
42     $self->encoder->encode( $data );
43 }
44
45 __PACKAGE__->meta->make_immutable;
46
47 1;