callback calling
Matt S Trout [Sat, 2 Jun 2012 11:28:49 +0000 (11:28 +0000)]
lib/Object/Remote/CodeContainer.pm [new file with mode: 0644]
lib/Object/Remote/Connection.pm
t/basic.t
t/lib/ORTestClass.pm

diff --git a/lib/Object/Remote/CodeContainer.pm b/lib/Object/Remote/CodeContainer.pm
new file mode 100644 (file)
index 0000000..948e63b
--- /dev/null
@@ -0,0 +1,9 @@
+package Object::Remote::CodeContainer;
+
+use Moo;
+
+has code => (is => 'ro', required => 1);
+
+sub call { shift->code->(@_) }
+
+1;
index d0679c4..ea1614d 100644 (file)
@@ -3,6 +3,7 @@ package Object::Remote::Connection;
 use Object::Remote::Future;
 use Object::Remote::Null;
 use Object::Remote::Handle;
+use Object::Remote::CodeContainer;
 use Object::Remote;
 use IO::Handle;
 use Module::Runtime qw(use_module);
@@ -57,17 +58,25 @@ has _json => (
   },
 );
 
+sub _id_to_remote_object {
+  my ($self, $id) = @_;
+  return bless({}, 'Object::Remote::Null') if $id eq 'NULL';
+  (
+    $self->remote_objects_by_id->{$id}
+    or Object::Remote::Handle->new(connection => $self, id => $id)
+  )->proxy;
+}
+
 sub _build__json {
   weaken(my $self = shift);
-  my $remotes = $self->remote_objects_by_id;
   JSON::PP->new->filter_json_single_key_object(
     __remote_object__ => sub {
-      my $id = shift;
-      return bless({}, 'Object::Remote::Null') if $id eq 'NULL';
-      (
-        $remotes->{$id}
-        or Object::Remote::Handle->new(connection => $self, id => $id)
-      )->proxy;
+      $self->_id_to_remote_object(@_);
+    }
+  )->filter_json_single_key_object(
+    __remote_code__ => sub {
+      my $code_container = $self->_id_to_remote_object(@_);
+      sub { $code_container->call(@_) };
     }
   );
 }
@@ -165,6 +174,11 @@ sub _deobjectify {
       return +{ map +($_ => $self->_deobjectify($data->{$_})), keys %$data };
     } elsif ($ref eq 'ARRAY') {
       return [ map $self->_deobjectify($_), @$data ];
+    } elsif ($ref eq 'CODE') {
+      my $id = $self->_local_object_to_id(
+                 Object::Remote::CodeContainer->new(code => $data)
+               );
+      return +{ __remote_code__ => $id };
     } else {
       die "Can't collapse reftype $ref";
     }
index 07d77ef..24913dc 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -25,4 +25,10 @@ is($remote->increment, 1, 'Increment to 1');
 
 is($remote->counter, 1, 'Counter at 1');
 
+my $x = 0;
+
+is($remote->call_callback(27, sub { $x++ }), 27, "Callback ok");
+
+is($x, 1, "Callback called callback");
+
 done_testing;
index 7e64bf1..0751492 100644 (file)
@@ -8,4 +8,10 @@ sub increment { $_[0]->_set_counter($_[0]->counter + 1); }
 
 sub pid { $$ }
 
+sub call_callback {
+  my ($self, $value, $cb) = @_;
+  $cb->();
+  return $value;
+}
+
 1;