factor out new_class_call_handler
[scpubgit/Object-Remote.git] / lib / Object / Remote / Connection.pm
index 4490e44..8f4d443 100644 (file)
@@ -128,13 +128,20 @@ sub send_class_call {
 
 sub register_class_call_handler {
   my ($self) = @_;
-  $self->local_objects_by_id->{'class_call_handler'}
-    = Object::Remote::CodeContainer->new(
-        code => sub {
-          my ($class, $method) = splice @_, 0, 2;
-          use_module($class)->$method(@_);
-        }
-      );
+  $self->local_objects_by_id->{'class_call_handler'} ||= do {
+    my $o = $self->new_class_call_handler;
+    $self->_local_object_to_id($o);
+    $o;
+  };
+}
+
+sub new_class_call_handler {
+  Object::Remote::CodeContainer->new(
+    code => sub {
+      my ($class, $method) = (shift, shift);
+      use_module($class)->$method(@_);
+    }
+  );
 }
 
 sub register_remote {
@@ -188,7 +195,7 @@ sub _send {
 
 sub _serialize {
   my ($self, $data) = @_;
-  local our @New_Ids;
+  local our @New_Ids = (-1);
   return eval {
     my $flat = $self->_encode($self->_deobjectify($data));
     warn "$$ >>> ${flat}\n" if $DEBUG;
@@ -205,7 +212,7 @@ sub _local_object_to_id {
   my ($self, $object) = @_;
   my $id = refaddr($object);
   $self->local_objects_by_id->{$id} ||= do {
-    push our(@New_Ids), $id;
+    push our(@New_Ids), $id if @New_Ids;
     $object;
   };
   return $id;
@@ -294,15 +301,6 @@ sub receive_call_free {
   $self->receive_free($id);
 }
 
-sub receive_class_call {
-  my ($self, $future_id, $class, @rest) = @_;
-  my $future = $self->_id_to_remote_object($future_id);
-  $future->{method} = 'call_discard_free';
-  eval { use_module($class) }
-    or do { $future->fail("Error loading ${class}: $@"); return };
-  $self->_invoke($future, $class, @rest);
-}
-
 sub _invoke {
   my ($self, $future, $local, $ctx, $method, @args) = @_;
   if ($method =~ /^start::/) {