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