new remote code
[scpubgit/Tak.git] / lib / Tak / Router.pm
CommitLineData
36cf3bcb 1package Tak::Router;
2
77bf1d9b 3use Tak::MetaService;
36cf3bcb 4use Moo;
5
31a246e4 6has services => (is => 'ro', default => sub { {} });
36cf3bcb 7
77bf1d9b 8sub BUILD {
9 my ($self) = @_;
10 $self->register(meta => Tak::MetaService->new(router => $self));
11}
12
31a246e4 13sub 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);
36cf3bcb 20}
21
22sub receive {
31a246e4 23 my ($self, $target, @payload) = @_;
24 return unless $target;
25 return unless my $next = $self->services->{$target};
26 $next->receive(@payload);
36cf3bcb 27}
28
8b6c1f59 29sub register {
30 my ($self, $name, $service) = @_;
31a246e4 31 $self->services->{$name} = $service;
32}
33
34sub deregister {
35 my ($self, $name) = @_;
36 delete $self->services->{$name}
8b6c1f59 37}
38
36cf3bcb 391;