clone_or_self
[scpubgit/Tak.git] / lib / Tak / Role / Service.pm
1 package Tak::Role::Service;
2
3 use Moo::Role;
4
5 sub start_request {
6   my ($self, $req, $type, @payload) = @_;
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;
13     if (eval { @result = $self->$meth(@payload); 1 }) {
14       $req->success(@result);
15     } else {
16       if (ref($@) eq 'ARRAY') {
17         $req->result(@{$@});
18       } else {
19         $req->failure(exception => $@);
20       }
21     }
22   } elsif ($meth = $self->can("start_${type}_request")) {
23     $self->$meth($req => @payload);
24   } else {
25     $req->mistake(request_type => "Unknown request type ${type}");
26   }
27 }
28
29 sub receive {
30   my ($self, $type, @payload) = @_;
31   if (my $meth = $self->can("receive_${type}")) {
32     $self->$meth(@payload);
33   }
34 }
35
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
39 sub clone_or_self { $_[0] }
40
41 1;