Commit | Line | Data |
36cf3bcb |
1 | package Tak::Router; |
2 | |
77bf1d9b |
3 | use Tak::MetaService; |
2791fd73 |
4 | use Scalar::Util qw(weaken); |
36cf3bcb |
5 | use Moo; |
6 | |
31a246e4 |
7 | has services => (is => 'ro', default => sub { {} }); |
36cf3bcb |
8 | |
77bf1d9b |
9 | sub BUILD { |
10 | my ($self) = @_; |
11 | $self->register(meta => Tak::MetaService->new(router => $self)); |
12 | } |
13 | |
31a246e4 |
14 | sub 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 | |
23 | sub 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 |
30 | sub register { |
31 | my ($self, $name, $service) = @_; |
31a246e4 |
32 | $self->services->{$name} = $service; |
33 | } |
34 | |
2791fd73 |
35 | sub register_weak { |
36 | my ($self, $name, $service) = @_; |
37 | weaken($self->services->{$name} = $service); |
38 | } |
39 | |
31a246e4 |
40 | sub deregister { |
41 | my ($self, $name) = @_; |
42 | delete $self->services->{$name} |
8b6c1f59 |
43 | } |
44 | |
36cf3bcb |
45 | 1; |