memory leak fixage
[scpubgit/Tak.git] / lib / Tak / MetaService.pm
CommitLineData
857f4834 1package Tak::MetaService;
2
2791fd73 3use Tak::WeakClient;
eca2edfe 4use Log::Contextual qw(:log);
857f4834 5use Moo;
6
31a246e4 7with 'Tak::Role::Service';
8
857f4834 9has router => (is => 'ro', required => 1, weak_ref => 1);
10
77bf1d9b 11sub handle_pid {
12 return $$;
13}
14
e99bc141 15sub handle_ensure {
16 my $self = shift;
17 my ($name) = @_;
18 return "Already have ${name}" if $self->router->services->{$name};
19 $self->handle_register(@_);
20}
21
857f4834 22sub handle_register {
2791fd73 23 my ($self, $name, $class, %args) = @_;
857f4834 24 (my $file = $class) =~ s/::/\//g;
25 require "${file}.pm";
eca2edfe 26 my $router = $self->router;
2791fd73 27 if (my $expose = delete $args{expose}) {
eca2edfe 28 foreach my $name (keys %$expose) {
29 if (my ($svc, @rest) = @{$expose->{$name}}) {
30 die "router has no service ${svc}"
31 unless my $service = $router->services->{$svc};
1224ea90 32 my $client_class = (
33 Scalar::Util::isweak($router->services->{$svc})
34 ? 'Tak::WeakClient'
35 : 'Tak::Client'
36 );
37 $args{$name} = $client_class->new(service => $service)
38 ->curry(@rest);
eca2edfe 39 } else {
40 $args{$name} = Tak::WeakClient->new(service => $router);
41 }
2791fd73 42 }
43 }
44 my $new = $class->new(\%args);
eca2edfe 45 $router->register($name => $new);
31a246e4 46 return "Registered ${name}";
857f4834 47}
48
491;