clone_or_self
[scpubgit/Tak.git] / lib / Tak / Role / Service.pm
CommitLineData
31a246e4 1package Tak::Role::Service;
2
3use Moo::Role;
4
5sub start_request {
77bf1d9b 6 my ($self, $req, $type, @payload) = @_;
31a246e4 7 unless ($type) {
8 $req->mistake(request_type => "No request type given");
9 return;
10 }
11 if (my $meth = $self->can("handle_${type}")) {
12 my @result;
77bf1d9b 13 if (eval { @result = $self->$meth(@payload); 1 }) {
31a246e4 14 $req->success(@result);
15 } else {
16 if (ref($@) eq 'ARRAY') {
17 $req->result(@{$@});
18 } else {
19 $req->failure(exception => $@);
20 }
21 }
77bf1d9b 22 } elsif ($meth = $self->can("start_${type}_request")) {
23 $self->$meth($req => @payload);
31a246e4 24 } else {
25 $req->mistake(request_type => "Unknown request type ${type}");
26 }
27}
28
77bf1d9b 29sub receive {
30 my ($self, $type, @payload) = @_;
31 if (my $meth = $self->can("receive_${type}")) {
32 $self->$meth(@payload);
33 }
34}
31a246e4 35
542ab416 36# This assumes that by default either services are not stateful
37# or do want to have persistent state. It's notably overriden by Router.
38
39sub clone_or_self { $_[0] }
40
31a246e4 411;