Mercurial > pub > Impl
comparison Lib/IMPL/Web/QueryHandler/JsonFormat.pm @ 118:79cdd6c86409
JSON support (experimental)
| author | wizard | 
|---|---|
| date | Mon, 07 Jun 2010 08:21:26 +0400 | 
| parents | |
| children | 41e9d9ea3db5 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 117:0475eb382085 | 118:79cdd6c86409 | 
|---|---|
| 1 package IMPL::Web::QueryHandler::JsonTransform; | |
| 2 package IMPL::Web::QueryHandler::JsonFormat; | |
| 3 use strict; | |
| 4 use base qw(IMPL::Web::QueryHandler); | |
| 5 | |
| 6 __PACKAGE__->PassThroughArgs; | |
| 7 | |
| 8 use Error qw(:try); | |
| 9 use JSON; | |
| 10 | |
| 11 sub Process { | |
| 12 my ($this,$action,$nextHandler) = @_; | |
| 13 | |
| 14 my $transform = new IMPL::Web::QueryHandler::JsonTransform(); | |
| 15 | |
| 16 my $result; | |
| 17 try { | |
| 18 $result = $nextHandler->(); | |
| 19 } otherwise { | |
| 20 my $err = shift; | |
| 21 $result = { error => $err }; | |
| 22 }; | |
| 23 | |
| 24 $action->response->contentType('text/javascript'); | |
| 25 my $hout = $action->response->streamBody; | |
| 26 print $hout to_json($result, {pretty => 1} ); | |
| 27 } | |
| 28 | |
| 29 package IMPL::Web::QueryHandler::JsonTransform; | |
| 30 | |
| 31 use base qw(IMPL::Transform); | |
| 32 use IMPL::Class::Property; | |
| 33 | |
| 34 BEGIN { | |
| 35 public property cacheClassProps => prop_all; | |
| 36 } | |
| 37 | |
| 38 our %CTOR = ( | |
| 39 'IMPL::Transform' => sub { | |
| 40 | |
| 41 -plain => sub { $_[1]; }, # keep plains as is | |
| 42 | |
| 43 HASH => sub { $_[1]; }, # keep arrays as is | |
| 44 | |
| 45 'IMPL::Object::List' => sub { [$_[1]->as_list()] }, # make a copy | |
| 46 | |
| 47 -default => sub { # convert to hash | |
| 48 my ($this,$object) = @_; | |
| 49 | |
| 50 my $propList = $this->cacheClassProps->{ref $object}; | |
| 51 unless ($propList) { | |
| 52 # derived first, then own properties, only public | |
| 53 my %props = map { $_->name, $_ } $this->get_meta( 'IMPL::Class::PropertyInfo', sub { $_->Access == IMPL::Class::Member::MOD_PUBLIC } , 1 ); | |
| 54 $this->cacheClassProps->{ref $object} = $propList = [keys %props]; | |
| 55 | |
| 56 } | |
| 57 | |
| 58 return { | |
| 59 map { | |
| 60 $_, | |
| 61 $this->Transform($object->$_()) | |
| 62 } @$propList | |
| 63 }; | |
| 64 } | |
| 65 } | |
| 66 ); | |
| 67 | |
| 68 sub CTOR { | |
| 69 my ($this) = @_; | |
| 70 | |
| 71 $this->cacheClassProps({}); | |
| 72 } | |
| 73 | |
| 74 1; | |
| 75 | |
| 76 __END__ | |
| 77 | |
| 78 =pod | |
| 79 | |
| 80 =cut | 
