actually start to add logging to Router
[scpubgit/Tak.git] / lib / Tak / Router.pm
CommitLineData
36cf3bcb 1package Tak::Router;
2
77bf1d9b 3use Tak::MetaService;
2791fd73 4use Scalar::Util qw(weaken);
e56859c3 5use Log::Contextual qw(:log);
36cf3bcb 6use Moo;
7
31a246e4 8has services => (is => 'ro', default => sub { {} });
36cf3bcb 9
77bf1d9b 10sub BUILD {
11 my ($self) = @_;
12 $self->register(meta => Tak::MetaService->new(router => $self));
13}
14
31a246e4 15sub start_request {
16 my ($self, $req, $target, @payload) = @_;
2791fd73 17 return $req->mistake("Reached router with no target")
31a246e4 18 unless $target;
2791fd73 19 return $req->failure("Reached router with invalid target ${target}")
31a246e4 20 unless my $next = $self->services->{$target};
21 $next->start_request($req, @payload);
36cf3bcb 22}
23
24sub receive {
31a246e4 25 my ($self, $target, @payload) = @_;
26 return unless $target;
e56859c3 27 log_debug { "Message received for ${target}" };
28 return log_info { "Discarded message to ${target}" }
29 unless my $next = $self->services->{$target};
31a246e4 30 $next->receive(@payload);
36cf3bcb 31}
32
8b6c1f59 33sub register {
34 my ($self, $name, $service) = @_;
31a246e4 35 $self->services->{$name} = $service;
36}
37
2791fd73 38sub register_weak {
39 my ($self, $name, $service) = @_;
40 weaken($self->services->{$name} = $service);
41}
42
31a246e4 43sub deregister {
44 my ($self, $name) = @_;
45 delete $self->services->{$name}
8b6c1f59 46}
47
542ab416 48sub clone_or_self {
fe725d6e 49 my ($self) = @_;
542ab416 50 (ref $self)->new(services => { %{$self->services} });
fe725d6e 51}
52
36cf3bcb 531;