Commit | Line | Data |
857f4834 |
1 | package Tak::MetaService; |
2 | |
2791fd73 |
3 | use Tak::WeakClient; |
857f4834 |
4 | use Moo; |
5 | |
31a246e4 |
6 | with 'Tak::Role::Service'; |
7 | |
857f4834 |
8 | has router => (is => 'ro', required => 1, weak_ref => 1); |
9 | |
77bf1d9b |
10 | sub handle_pid { |
11 | return $$; |
12 | } |
13 | |
e99bc141 |
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 | |
857f4834 |
21 | sub handle_register { |
2791fd73 |
22 | my ($self, $name, $class, %args) = @_; |
857f4834 |
23 | (my $file = $class) =~ s/::/\//g; |
24 | require "${file}.pm"; |
2791fd73 |
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); |
857f4834 |
32 | $self->router->register($name => $new); |
31a246e4 |
33 | return "Registered ${name}"; |
857f4834 |
34 | } |
35 | |
36 | 1; |