Commit | Line | Data |
e49c818e |
1 | package Tak::ObjectClient; |
2 | |
3 | use Tak::ObjectProxy; |
4 | use Moo; |
5 | |
6 | with 'Tak::Role::ObjectMangling'; |
7 | |
13ca23bc |
8 | has remote => (is => 'ro', required => 1); |
e49c818e |
9 | |
13ca23bc |
10 | has object_service => (is => 'lazy'); |
e49c818e |
11 | |
13ca23bc |
12 | sub _build_object_service { |
e49c818e |
13 | my ($self) = @_; |
13ca23bc |
14 | my $remote = $self->remote; |
5e5069ca |
15 | $remote->ensure(object_service => 'Tak::ObjectService'); |
13ca23bc |
16 | $remote->curry('object_service'); |
e49c818e |
17 | } |
18 | |
19 | sub proxy_method_call { |
20 | my ($self, @call) = @_; |
13ca23bc |
21 | my $client = $self->object_service; |
e49c818e |
22 | my $ready = $self->encode_objects(\@call); |
23 | my $context = wantarray; |
13ca23bc |
24 | my $res = $client->do(call_method => $context => $ready); |
25 | my $unpacked = $self->decode_objects($res); |
26 | if ($context) { |
27 | return @$unpacked; |
28 | } elsif (defined $context) { |
29 | return $unpacked->[0]; |
e49c818e |
30 | } else { |
13ca23bc |
31 | return; |
e49c818e |
32 | } |
33 | } |
34 | |
35 | sub proxy_death { |
36 | my ($self, $proxy) = @_; |
13ca23bc |
37 | $self->client->do(remove_object => $proxy->{tag}); |
e49c818e |
38 | } |
39 | |
40 | sub inflate { |
41 | my ($self, $tag) = @_; |
42 | bless({ client => $self, tag => $tag }, 'Tak::ObjectProxy'); |
43 | } |
44 | |
45 | sub deflate { |
46 | my ($self, $obj) = @_; |
47 | unless (ref($obj) eq 'Tak::ObjectProxy') { |
48 | die "Can't deflate non-proxied object ${obj}"; |
49 | } |
50 | return +{ __proxied_object__ => $obj->{tag} }; |
51 | } |
52 | |
53 | sub new_object { |
54 | my ($self, $class, @args) = @_; |
55 | $self->proxy_method_call($class, 'new', @args); |
56 | } |
57 | |
58 | 1; |