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