start and await_all working
Matt S Trout [Fri, 18 May 2012 00:18:48 +0000 (00:18 +0000)]
lib/Object/Remote.pm
lib/Object/Remote/Connection.pm
lib/Object/Remote/Future.pm
lib/Object/Remote/Proxy.pm

index 25f0349..680197e 100644 (file)
@@ -59,6 +59,7 @@ sub current_loop {
 sub call {
   my ($self, $method, @args) = @_;
   my $w = wantarray;
+  $method = "start::${method}" if (caller(0)||'') eq 'start';
   future {
     $self->connection->send(call => $self->id, $w, $method, @args)
   };
index 3b66cd5..f69275d 100644 (file)
@@ -204,6 +204,7 @@ sub _invoke {
   if ($method =~ /^start::/) {
     my $f = $local->$method(@args);
     $f->on_done(sub { undef($f); $future->done(@_) });
+    return unless $f;
     $f->on_fail(sub { undef($f); $future->fail(@_) });
     return;
   }
index 2fe171b..11850d6 100644 (file)
@@ -6,7 +6,7 @@ use base qw(Exporter);
 
 use CPS::Future;
 
-our @EXPORT = qw(future await_future);
+our @EXPORT = qw(future await_future await_all);
 
 sub future (&) {
   my $f = $_[0]->(CPS::Future->new);
@@ -24,6 +24,11 @@ sub await_future {
   return wantarray ? $f->get : ($f->get)[0];
 }
 
+sub await_all {
+  await_future(CPS::Future->needs_all(@_));
+  map $_->get, @_;
+}
+
 package start;
 
 sub AUTOLOAD {
@@ -46,15 +51,4 @@ sub AUTOLOAD {
   return $res;
 }
 
-package await;
-
-sub AUTOLOAD {
-  my $invocant = shift;
-  my ($method) = our $AUTOLOAD =~ /([^:]+)$/;
-  my @invocants = (ref($invocant) eq 'ARRAY' ? @$invocant : $invocant);
-  my @futures = map $_->${\"start::${method}"}, @$invocant;
-  Object::Remote::Future::await_future(CPS::Future->needs_all(@futures));
-  return map $_->get, @futures;
-}
-
 1;
index af6a902..3c46eeb 100644 (file)
@@ -5,10 +5,11 @@ use strictures 1;
 sub AUTOLOAD {
   my $self = shift;
   (my $method) = (our $AUTOLOAD =~ /([^:]+)$/);
+  my $to_fire = $self->{method};
   if ((caller(0)||'') eq 'start') {
-    $method = "start::${method}";
+    $to_fire = "start::${to_fire}";
   }
-  $self->{remote}->${\$self->{method}}($method => @_);
+  $self->{remote}->$to_fire($method => @_);
 }
 
 sub DESTROY { }