package Object::Remote;
use Object::Remote::MiniLoop;
-use Object::Remote::Proxy;
-use Scalar::Util qw(weaken blessed);
-use Object::Remote::Future;
-use Module::Runtime qw(use_module);
-use Moo;
+use Object::Remote::Handle;
sub new::on {
my ($class, $on, @args) = @_;
- __PACKAGE__->new(
+ Object::Remote::Handle->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');
-
-has disarmed_free => (is => 'rwp');
-
-sub disarm_free { $_[0]->_set_disarmed_free(1); $_[0] }
-
-sub proxy {
- bless({ remote => $_[0], method => 'call' }, 'Object::Remote::Proxy');
-}
-
-sub BUILD {
- 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(
- await_future(
- $self->connection->send(
- class_call => $args->{class}, 0,
- $args->{constructor}||'new', @{$args->{args}||[]}
- )
- )->{remote}->disarm_free->id
- );
- }
- $self->connection->register_remote($self);
+sub new {
+ shift;
+ Object::Remote::Handle->new(@_)->proxy;
}
sub current_loop {
our $Current_Loop ||= Object::Remote::MiniLoop->new
}
-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)
- };
-}
-
-sub call_discard {
- my ($self, $method, @args) = @_;
- $self->connection->send_discard(call => $self->id, $method, @args);
-}
-
-sub call_discard_free {
- my ($self, $method, @args) = @_;
- $self->disarm_free;
- $self->connection->send_discard(call_free => $self->id, $method, @args);
-}
-
-sub DEMOLISH {
- my ($self, $gd) = @_;
- return if $gd or $self->disarmed_free;
- $self->connection->send_free($self->id);
-}
-
1;
use Object::Remote::Future;
use Object::Remote::Null;
+use Object::Remote::Handle;
use Object::Remote;
use IO::Handle;
use Module::Runtime qw(use_module);
return bless({}, 'Object::Remote::Null') if $id eq 'NULL';
(
$remotes->{$id}
- or Object::Remote->new(connection => $self, id => $id)
+ or Object::Remote::Handle->new(connection => $self, id => $id)
)->proxy;
}
);
--- /dev/null
+package Object::Remote::Handle;
+
+use Object::Remote::Proxy;
+use Scalar::Util qw(weaken blessed);
+use Object::Remote::Future;
+use Module::Runtime qw(use_module);
+use Moo;
+
+has connection => (
+ is => 'ro', required => 1,
+ coerce => sub {
+ blessed($_[0])
+ ? $_[0]
+ : use_module('Object::Remote::Connection')->new_from_spec($_[0])
+ },
+);
+
+has id => (is => 'rwp');
+
+has disarmed_free => (is => 'rwp');
+
+sub disarm_free { $_[0]->_set_disarmed_free(1); $_[0] }
+
+sub proxy {
+ bless({ remote => $_[0], method => 'call' }, 'Object::Remote::Proxy');
+}
+
+sub BUILD {
+ 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(
+ await_future(
+ $self->connection->send(
+ class_call => $args->{class}, 0,
+ $args->{constructor}||'new', @{$args->{args}||[]}
+ )
+ )->{remote}->disarm_free->id
+ );
+ }
+ $self->connection->register_remote($self);
+}
+
+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)
+ };
+}
+
+sub call_discard {
+ my ($self, $method, @args) = @_;
+ $self->connection->send_discard(call => $self->id, $method, @args);
+}
+
+sub call_discard_free {
+ my ($self, $method, @args) = @_;
+ $self->disarm_free;
+ $self->connection->send_discard(call_free => $self->id, $method, @args);
+}
+
+sub DEMOLISH {
+ my ($self, $gd) = @_;
+ return if $gd or $self->disarmed_free;
+ $self->connection->send_free($self->id);
+}
+
+1;
#$Object::Remote::Connection::DEBUG = 1;
-my $proxy = Object::Remote->new(
+my $remote = Object::Remote->new(
connection => $connection,
class => 'ORTestClass'
-)->proxy;
+);
-isnt($$, $proxy->pid, 'Different pid on the other side');
+isnt($$, $remote->pid, 'Different pid on the other side');
-is($proxy->counter, 0, 'Counter at 0');
+is($remote->counter, 0, 'Counter at 0');
-is($proxy->increment, 1, 'Increment to 1');
+is($remote->increment, 1, 'Increment to 1');
-is($proxy->counter, 1, 'Counter at 1');
+is($remote->counter, 1, 'Counter at 1');
done_testing;
args => { module_sender => $ms },
);
-my $proxy = Object::Remote->new(
+my $counter = Object::Remote->new(
connection => $connection,
class => 'ORTestClass'
-)->proxy;
+);
-isnt($$, $proxy->pid, 'Different pid on the other side');
+isnt($$, $counter->pid, 'Different pid on the other side');
-is($proxy->counter, 0, 'Counter at 0');
+is($counter->counter, 0, 'Counter at 0');
-is($proxy->increment, 1, 'Increment to 1');
+is($counter->increment, 1, 'Increment to 1');
-is($proxy->counter, 1, 'Counter at 1');
+is($counter->counter, 1, 'Counter at 1');
done_testing;