1 package Object::Remote::Future;
9 our @EXPORT = qw(future await_future await_all);
12 my $f = $_[0]->(CPS::Future->new);
13 return $f if ((caller(1)||'') eq 'start');
19 return $f if $f->is_ready;
20 require Object::Remote;
21 my $loop = Object::Remote->current_loop;
22 $f->on_ready(sub { $loop->stop });
24 return wantarray ? $f->get : ($f->get)[0];
28 await_future(CPS::Future->needs_all(@_));
36 my ($method) = our $AUTOLOAD =~ /^start::(.+)$/;
38 unless (eval { $res = $invocant->$method(@_); 1 }) {
39 my $f = CPS::Future->new;
43 unless (Scalar::Util::blessed($res) and $res->isa('CPS::Future')) {
44 my $f = CPS::Future->new;
55 my ($method) = our $AUTOLOAD =~ /^then::(.+)$/;
57 # Need two copies since if we're called on an already complete future
58 # $f will be freed immediately
59 my $ret = my $f = CPS::Future->new;
60 $invocant->on_fail(sub { $f->fail(@_); undef($f); });
61 $invocant->on_done(sub {
63 my $next = $obj->${\"start::${method}"}(@args);
64 $next->on_done(sub { $f->done(@_); undef($f); });
65 $next->on_fail(sub { $f->fail(@_); undef($f); });
74 Object::Remote::Future - Asynchronous calling for L<Object::Remote>
78 Shipping prioritised over writing this part up. Blame mst.