switch object client to new code
[scpubgit/Tak.git] / lib / Tak / ObjectService.pm
CommitLineData
e49c818e 1package Tak::ObjectService;
2
3use overload ();
4use Moo;
5
13ca23bc 6with 'Tak::Role::Service';
e49c818e 7with 'Tak::Role::ObjectMangling';
8
9has proxied => (is => 'ro', init_arg => undef, default => sub { {} });
10
11sub inflate {
12 my ($self, $tag) = @_;
13 $self->proxied->{$tag};
14}
15
16sub deflate {
17 my ($self, $obj) = @_;
18 my $tag = overload::StrVal($obj);
19 $self->proxied->{$tag} = $obj;
20 return +{ __proxied_object__ => $tag };
21}
22
23sub handle_call_method {
24 my ($self, $context, $call) = @_;
25 my ($invocant, $method, @args) = @{$self->decode_objects($call)};
26 my @res;
27 eval {
28 if (!ref($invocant)) {
29 (my $file = $invocant) =~ s/::/\//g;
30 require "${file}.pm";
31 }
32 if ($context) {
33 @res = $invocant->$method(@args);
34 } elsif (defined $context) {
35 $res[0] = $invocant->$method(@args);
36 } else {
37 $invocant->$method(@args);
38 }
39 1;
13ca23bc 40 } or die [ failure => "$@" ];
41 return $self->encode_objects(\@res);
e49c818e 42}
43
44sub handle_remove_object {
45 my ($self, $tag) = @_;
46 my $had = !!delete $self->proxied->{$tag};
13ca23bc 47 return $had;
e49c818e 48}
49
501;