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"; |
2791fd73 |
26 | if (my $expose = delete $args{expose}) { |
430a5f89 |
27 | %args = (%args, %{$self->_construct_exposed_clients($expose)}); |
28 | } |
29 | my $new = $class->new(\%args); |
30 | $self->router->register($name => $new); |
31 | return "Registered ${name}"; |
32 | } |
33 | |
34 | sub _construct_exposed_clients { |
35 | my ($self, $expose) = @_; |
36 | my $router = $self->router; |
37 | my %client; |
38 | foreach my $name (keys %$expose) { |
39 | local $_ = $expose->{$name}; |
40 | if (ref eq 'HASH') { |
41 | $client{$name} = Tak::Client->new( |
42 | service => Tak::Router->new( |
43 | services => $self->_construct_exposed_clients($_) |
44 | ) |
45 | ); |
46 | } elsif (ref eq 'ARRAY') { |
47 | if (my ($svc, @rest) = @$_) { |
eca2edfe |
48 | die "router has no service ${svc}" |
49 | unless my $service = $router->services->{$svc}; |
1224ea90 |
50 | my $client_class = ( |
51 | Scalar::Util::isweak($router->services->{$svc}) |
52 | ? 'Tak::WeakClient' |
53 | : 'Tak::Client' |
54 | ); |
430a5f89 |
55 | $client{$name} = $client_class->new(service => $service) |
56 | ->curry(@rest); |
eca2edfe |
57 | } else { |
430a5f89 |
58 | $client{$name} = Tak::WeakClient->new(service => $router); |
eca2edfe |
59 | } |
430a5f89 |
60 | } else { |
61 | die "expose key ${name} was ".ref; |
2791fd73 |
62 | } |
63 | } |
430a5f89 |
64 | \%client; |
857f4834 |
65 | } |
66 | |
67 | 1; |