factor handle code out so Object::Remote->new returns a proxy
Matt S Trout [Fri, 18 May 2012 00:31:30 +0000 (00:31 +0000)]
lib/Object/Remote.pm
lib/Object/Remote/Connection.pm
lib/Object/Remote/Handle.pm [new file with mode: 0644]
t/basic.t
t/sender.t

index 680197e..47f2906 100644 (file)
@@ -1,85 +1,24 @@
 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;
index f69275d..eb3c6cb 100644 (file)
@@ -2,6 +2,7 @@ package Object::Remote::Connection;
 
 use Object::Remote::Future;
 use Object::Remote::Null;
+use Object::Remote::Handle;
 use Object::Remote;
 use IO::Handle;
 use Module::Runtime qw(use_module);
@@ -56,7 +57,7 @@ sub _build__json {
       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;
     }
   );
diff --git a/lib/Object/Remote/Handle.pm b/lib/Object/Remote/Handle.pm
new file mode 100644 (file)
index 0000000..1a757ab
--- /dev/null
@@ -0,0 +1,71 @@
+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;
index 77f0c69..07d77ef 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -12,17 +12,17 @@ my $connection = Object::Remote::Connector::Local->new->connect;
 
 #$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;
index 8916297..02eb0d8 100644 (file)
@@ -21,17 +21,17 @@ my $ml = Object::Remote->new(
   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;