move exec code to Client.pm, add get_homedir example to Takfile
[scpubgit/Tak.git] / lib / Tak / ObjectClient.pm
CommitLineData
e49c818e 1package Tak::ObjectClient;
2
3use Tak::ObjectProxy;
4use Moo;
5
6with 'Tak::Role::ObjectMangling';
7
13ca23bc 8has remote => (is => 'ro', required => 1);
e49c818e 9
13ca23bc 10has object_service => (is => 'lazy');
e49c818e 11
13ca23bc 12sub _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
19sub 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
35sub proxy_death {
36 my ($self, $proxy) = @_;
13ca23bc 37 $self->client->do(remove_object => $proxy->{tag});
e49c818e 38}
39
40sub inflate {
41 my ($self, $tag) = @_;
42 bless({ client => $self, tag => $tag }, 'Tak::ObjectProxy');
43}
44
45sub 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
53sub new_object {
54 my ($self, $class, @args) = @_;
55 $self->proxy_method_call($class, 'new', @args);
56}
57
581;