X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTak%2FRouter.pm;h=a8b071c545317ff709600a9c865de401781115df;hb=fe725d6e99834f26f20ce3f78eda9591c0d4a7d1;hp=f7e56dd6b30a54f19aa031596db77a9111f02506;hpb=77bf1d9b5b6832894676ab549ee5664cb7200d33;p=scpubgit%2FTak.git diff --git a/lib/Tak/Router.pm b/lib/Tak/Router.pm index f7e56dd..a8b071c 100644 --- a/lib/Tak/Router.pm +++ b/lib/Tak/Router.pm @@ -1,6 +1,7 @@ package Tak::Router; use Tak::MetaService; +use Scalar::Util qw(weaken); use Moo; has services => (is => 'ro', default => sub { {} }); @@ -12,9 +13,9 @@ sub BUILD { sub start_request { my ($self, $req, $target, @payload) = @_; - $req->mistake("Reached router with no target") + return $req->mistake("Reached router with no target") unless $target; - $req->failure("Reached router with invalid target ${target}") + return $req->failure("Reached router with invalid target ${target}") unless my $next = $self->services->{$target}; $next->start_request($req, @payload); } @@ -31,9 +32,21 @@ sub register { $self->services->{$name} = $service; } +sub register_weak { + my ($self, $name, $service) = @_; + weaken($self->services->{$name} = $service); +} + sub deregister { my ($self, $name) = @_; delete $self->services->{$name} } +sub clone { + my ($self) = @_; + my $new = (ref $self)->new(services => $self->services); + $new->register(meta => Tak::MetaService->new(router => $new)); + $new; +} + 1;