Commit | Line | Data |
31a246e4 |
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 | |
bebc6313 |
16 | sub send { shift->receive(@_) } |
17 | |
18 | sub receive { |
31a246e4 |
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); |
bebc6313 |
26 | $self->start_request($req, @payload); |
31a246e4 |
27 | return $req; |
28 | } |
29 | |
bebc6313 |
30 | sub start_request { |
31 | my ($self, $req, @payload) = @_; |
32 | $self->service->start_request($req, @{$self->curried}, @payload); |
33 | } |
34 | |
31a246e4 |
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 { |
77bf1d9b |
43 | shift->result_of(@_)->get; |
44 | } |
45 | |
46 | sub result_of { |
31a246e4 |
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); |
77bf1d9b |
54 | return $result; |
31a246e4 |
55 | } |
56 | |
542ab416 |
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 | |
31a246e4 |
65 | 1; |