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