clone_or_self
[scpubgit/Tak.git] / lib / Tak / Client.pm
CommitLineData
31a246e4 1package Tak::Client;
2
3use Tak;
4use Tak::Request;
5use Moo;
6
7has service => (is => 'ro', required => 1);
8
9has curried => (is => 'ro', default => sub { [] });
10
11sub curry {
12 my ($self, @curry) = @_;
13 (ref $self)->new(%$self, curried => [ @{$self->curried}, @curry ]);
14}
15
bebc6313 16sub send { shift->receive(@_) }
17
18sub receive {
31a246e4 19 my ($self, @message) = @_;
20 $self->service->receive(@{$self->curried}, @message);
21}
22
23sub 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 30sub start_request {
31 my ($self, $req, @payload) = @_;
32 $self->service->start_request($req, @{$self->curried}, @payload);
33}
34
31a246e4 35sub request_class { 'Tak::Request' }
36
37sub _new_request {
38 my ($self, $args) = @_;
39 $self->request_class->new($args);
40}
41
42sub do {
77bf1d9b 43 shift->result_of(@_)->get;
44}
45
46sub 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 57sub 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 651;