clone_or_self
[scpubgit/Tak.git] / lib / Tak / Client.pm
1 package Tak::Client;
2
3 use Tak;
4 use Tak::Request;
5 use Moo;
6
7 has service => (is => 'ro', required => 1);
8
9 has curried => (is => 'ro', default => sub { [] });
10
11 sub curry {
12   my ($self, @curry) = @_;
13   (ref $self)->new(%$self, curried => [ @{$self->curried}, @curry ]);
14 }
15
16 sub send { shift->receive(@_) }
17
18 sub receive {
19   my ($self, @message) = @_;
20   $self->service->receive(@{$self->curried}, @message);
21 }
22
23 sub start {
24   my ($self, $register, @payload) = @_;
25   my $req = $self->_new_request($register);
26   $self->start_request($req, @payload);
27   return $req;
28 }
29
30 sub start_request {
31   my ($self, $req, @payload) = @_;
32   $self->service->start_request($req, @{$self->curried}, @payload);
33 }
34
35 sub request_class { 'Tak::Request' }
36
37 sub _new_request {
38   my ($self, $args) = @_;
39   $self->request_class->new($args);
40 }
41
42 sub do {
43   shift->result_of(@_)->get;
44 }
45
46 sub result_of {
47   my ($self, @payload) = @_;
48   my $done;
49   my $result;
50   my $req = $self->start({
51     on_result => sub { $result = shift },
52   }, @payload);
53   Tak->loop_until($result);
54   return $result;
55 }
56
57 sub clone_or_self {
58   my ($self) = @_;
59   (ref $self)->new(
60     service => $self->service->clone_or_self, 
61     curried => [ @{$self->curried} ],
62   );
63 }
64
65 1;