Mercurial > pub > Impl
comparison lib/IMPL/Web/Handler/JSONView.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
406:f23fcb19d3c1 | 407:c6e90e02dd17 |
---|---|
1 package IMPL::Web::Handler::JSONView; | |
2 use strict; | |
3 use JSON; | |
4 | |
5 use IMPL::lang qw(is); | |
6 use IMPL::Const qw(:prop); | |
7 use IMPL::declare { | |
8 require => { | |
9 HttpResponse => 'IMPL::Web::HttpResponse', | |
10 ViewResult => '-IMPL::Web::ViewResult', | |
11 Loader => 'IMPL::Code::Loader' | |
12 }, | |
13 base => [ | |
14 'IMPL::Object' => undef, | |
15 'IMPL::Object::Serializable' => undef, | |
16 'IMPL::Object::Autofill' => '@_' | |
17 ], | |
18 props => [ | |
19 transform => PROP_RW | |
20 ] | |
21 }; | |
22 | |
23 sub contentType { | |
24 'application/json' | |
25 } | |
26 | |
27 sub Invoke { | |
28 my ($this,$action,$next) = @_; | |
29 | |
30 my $result = $next ? $next->($action) : undef; | |
31 | |
32 | |
33 my $model = ( ref $result and is($result,ViewResult) ) | |
34 ? $result->model | |
35 : $result; | |
36 | |
37 $model = [$model] unless ref $model; | |
38 | |
39 if (my $factory = $this->transform) { | |
40 Loader->safe->Require($factory) unless ref $factory; | |
41 my $t = $this->transform->new(); | |
42 $model = $t->Transform($model); | |
43 } | |
44 | |
45 my %params = ( | |
46 type => $this->contentType, | |
47 charset => 'utf-8', | |
48 body => JSON->new->utf8->pretty->encode($model) | |
49 ); | |
50 | |
51 if(is($result,ViewResult)) { | |
52 $params{status} = $result->status if $result->status; | |
53 $params{headers} = $result->headers if $result->headers; | |
54 $params{cookies} = $result->cookies if $result->cookies; | |
55 } | |
56 | |
57 return HttpResponse->new( | |
58 %params | |
59 ); | |
60 } | |
61 | |
62 1; | |
63 | |
64 __END__ | |
65 | |
66 =pod | |
67 | |
68 =head1 | |
69 | |
70 =cut |