1 package Object::Remote;
3 use Object::Remote::MiniLoop;
4 use Object::Remote::Proxy;
5 use Scalar::Util qw(weaken blessed);
6 use Object::Remote::Future;
7 use Module::Runtime qw(use_module);
11 my ($class, $on, @args) = @_;
20 is => 'ro', required => 1,
24 : use_module('Object::Remote::Connection')->new_from_spec($_[0])
28 has id => (is => 'rwp');
30 has disarmed_free => (is => 'rwp');
32 sub disarm_free { $_[0]->_set_disarmed_free(1); $_[0] }
35 bless({ remote => $_[0], method => 'call' }, 'Object::Remote::Proxy');
39 my ($self, $args) = @_;
41 die "No id supplied and no class either" unless $args->{class};
42 ref($_) eq 'HASH' and $_ = [ %$_ ] for $args->{args};
45 $self->connection->send(
46 class_call => $args->{class}, 0,
47 $args->{constructor}||'new', @{$args->{args}||[]}
49 )->{remote}->disarm_free->id
52 $self->connection->register_remote($self);
56 our $Current_Loop ||= Object::Remote::MiniLoop->new
60 my ($self, $method, @args) = @_;
62 $method = "start::${method}" if (caller(0)||'') eq 'start';
64 $self->connection->send(call => $self->id, $w, $method, @args)
69 my ($self, $method, @args) = @_;
70 $self->connection->send_discard(call => $self->id, $method, @args);
73 sub call_discard_free {
74 my ($self, $method, @args) = @_;
76 $self->connection->send_discard(call_free => $self->id, $method, @args);
81 return if $gd or $self->disarmed_free;
82 $self->connection->send_free($self->id);