only weaken when required
[scpubgit/Tak.git] / lib / Tak / MetaService.pm
index 62bafa8..203f7af 100644 (file)
@@ -1,6 +1,7 @@
 package Tak::MetaService;
 
 use Tak::WeakClient;
+use Log::Contextual qw(:log);
 use Moo;
 
 with 'Tak::Role::Service';
@@ -11,18 +12,32 @@ sub handle_pid {
   return $$;
 }
 
+sub handle_ensure {
+  my $self = shift;
+  my ($name) = @_;
+  return "Already have ${name}" if $self->router->services->{$name};
+  $self->handle_register(@_);
+}
+
 sub handle_register {
   my ($self, $name, $class, %args) = @_;
   (my $file = $class) =~ s/::/\//g;
   require "${file}.pm";
+  my $router = $self->router;
   if (my $expose = delete $args{expose}) {
-    my $client = Tak::WeakClient->new(service => $self->router);
-    foreach my $name (%$expose) {
-      $args{$name} = $client->curry(@{$expose->{$name}});
+    foreach my $name (keys %$expose) {
+      if (my ($svc, @rest) = @{$expose->{$name}}) {
+        die "router has no service ${svc}"
+          unless my $service = $router->services->{$svc};
+        $args{$name} = Tak::Client->new(service => $service)
+                                  ->curry(@rest);
+      } else {
+        $args{$name} = Tak::WeakClient->new(service => $router);
+      }
     }
   }
   my $new = $class->new(\%args);
-  $self->router->register($name => $new);
+  $router->register($name => $new);
   return "Registered ${name}";
 }