Commit | Line | Data |
857f4834 |
1 | package Tak::MetaService; |
2 | |
2791fd73 |
3 | use Tak::WeakClient; |
eca2edfe |
4 | use Log::Contextual qw(:log); |
857f4834 |
5 | use Moo; |
6 | |
31a246e4 |
7 | with 'Tak::Role::Service'; |
8 | |
857f4834 |
9 | has router => (is => 'ro', required => 1, weak_ref => 1); |
10 | |
77bf1d9b |
11 | sub handle_pid { |
12 | return $$; |
13 | } |
14 | |
e99bc141 |
15 | sub 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 |
22 | sub 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}; |
32 | $args{$name} = Tak::Client->new(service => $service) |
33 | ->curry(@rest); |
34 | } else { |
35 | $args{$name} = Tak::WeakClient->new(service => $router); |
36 | } |
2791fd73 |
37 | } |
38 | } |
39 | my $new = $class->new(\%args); |
eca2edfe |
40 | $router->register($name => $new); |
31a246e4 |
41 | return "Registered ${name}"; |
857f4834 |
42 | } |
43 | |
44 | 1; |