9706160357e3ec5386ca0f681a1bf6579c9a140a
[scpubgit/Tak.git] / lib / Tak / MetaService.pm
1 package Tak::MetaService;
2
3 use Tak::WeakClient;
4 use Moo;
5
6 with 'Tak::Role::Service';
7
8 has router => (is => 'ro', required => 1, weak_ref => 1);
9
10 sub handle_pid {
11   return $$;
12 }
13
14 sub handle_ensure {
15   my $self = shift;
16   my ($name) = @_;
17   return "Already have ${name}" if $self->router->services->{$name};
18   $self->handle_register(@_);
19 }
20
21 sub handle_register {
22   my ($self, $name, $class, %args) = @_;
23   (my $file = $class) =~ s/::/\//g;
24   require "${file}.pm";
25   if (my $expose = delete $args{expose}) {
26     my $client = Tak::WeakClient->new(service => $self->router);
27     foreach my $name (%$expose) {
28       $args{$name} = $client->curry(@{$expose->{$name}});
29     }
30   }
31   my $new = $class->new(\%args);
32   $self->router->register($name => $new);
33   return "Registered ${name}";
34 }
35
36 1;