5c2502b7eb017cb8881706da2ff545e314b36d5c
[scpubgit/Tak.git] / lib / Tak / Router.pm
1 package Tak::Router;
2
3 use Tak::MetaService;
4 use Scalar::Util qw(weaken);
5 use Moo;
6
7 has services => (is => 'ro', default => sub { {} });
8
9 sub BUILD {
10   my ($self) = @_;
11   $self->register(meta => Tak::MetaService->new(router => $self));
12 }
13
14 sub start_request {
15   my ($self, $req, $target, @payload) = @_;
16   return $req->mistake("Reached router with no target")
17     unless $target;
18   return $req->failure("Reached router with invalid target ${target}")
19     unless my $next = $self->services->{$target};
20   $next->start_request($req, @payload);
21 }
22
23 sub receive {
24   my ($self, $target, @payload) = @_;
25   return unless $target;
26   return unless my $next = $self->services->{$target};
27   $next->receive(@payload);
28 }
29
30 sub register {
31   my ($self, $name, $service) = @_;
32   $self->services->{$name} = $service;
33 }
34
35 sub register_weak {
36   my ($self, $name, $service) = @_;
37   weaken($self->services->{$name} = $service);
38 }
39
40 sub deregister {
41   my ($self, $name) = @_;
42   delete $self->services->{$name}
43 }
44
45 1;