9ef5380824f66d47f834fa6cc1a7dc7ec7fee0d9
[scpubgit/Tak.git] / lib / Tak / Role / ObjectMangling.pm
1 package Tak::Role::ObjectMangling;
2
3 use Scalar::Util qw(weaken);
4 use JSON::PP qw(encode_json decode_json);
5
6 use Moo::Role;
7
8 requires 'inflate';
9 requires 'deflate';
10
11 has encoder_json => (is => 'lazy');
12 has decoder_json => (is => 'lazy');
13
14 sub _build_encoder_json {
15   JSON::PP->new->allow_nonref(1)->convert_blessed(1);
16 }
17
18 sub _build_decoder_json {
19   my $self = shift;
20   weaken($self);
21   JSON::PP->new->allow_nonref(1)->filter_json_single_key_object(
22     __proxied_object__ => sub { $self->inflate($_[0]) }
23   );
24 }
25
26 sub encode_objects {
27   my ($self, $data) = @_;
28   local *UNIVERSAL::TO_JSON = sub { $self->deflate($_[0]) };
29   decode_json($self->encoder_json->encode($data));
30 }
31
32 sub decode_objects {
33   my ($self, $data) = @_;
34   $self->decoder_json->decode(encode_json($data));
35 }
36