use Object::Remote::MiniLoop;
use Object::Remote::Proxy;
-use Scalar::Util qw(weaken);
+use Scalar::Util qw(weaken blessed);
+use Object::Remote::Future;
+use Module::Runtime qw(use_module);
use Moo;
-has connection => (is => 'ro', required => 1);
+sub new::on {
+ my ($class, $on, @args) = @_;
+ __PACKAGE__->new(
+ connection => $on,
+ class => $class,
+ args => \@args
+ )->proxy;
+}
+
+has connection => (
+ is => 'ro', required => 1,
+ coerce => sub {
+ blessed($_[0])
+ ? $_[0]
+ : use_module('Object::Remote::Connection')->new_from_spec($_[0])
+ },
+);
has id => (is => 'rwp');
my ($self, $args) = @_;
unless ($self->id) {
die "No id supplied and no class either" unless $args->{class};
+ ref($_) eq 'HASH' and $_ = [ %$_ ] for $args->{args};
$self->_set_id(
- $self->_await(
+ await_future(
$self->connection->send(
- class_call => $args->{class},
+ class_call => $args->{class}, 0,
$args->{constructor}||'new', @{$args->{args}||[]}
)
)->{remote}->disarm_free->id
sub call {
my ($self, $method, @args) = @_;
- $self->_await($self->connection->send(call => $self->id, $method, @args));
+ my $w = wantarray;
+ future {
+ $self->connection->send(call => $self->id, $w, $method, @args)
+ };
}
sub call_discard {
$self->connection->send_discard(call => $self->id, $method, @args);
}
-sub _await {
- my ($self, $future) = @_;
- my $loop = $self->current_loop;
- $future->on_ready(sub { $loop->stop });
- $loop->run;
- ($future->get)[0];
+sub call_discard_free {
+ my ($self, $method, @args) = @_;
+ $self->disarm_free;
+ $self->connection->send_discard(call_free => $self->id, $method, @args);
}
sub DEMOLISH {