minor API cleanups
[scpubgit/Object-Remote.git] / lib / Object / Remote / Connection.pm
index e3cb452..c5bc9f6 100644 (file)
@@ -41,9 +41,15 @@ sub _build_ready_future { CPS::Future->new }
 
 has _receive_data_buffer => (is => 'ro', default => sub { my $x = ''; \$x });
 
-has local_objects_by_id => (is => 'ro', default => sub { {} });
+has local_objects_by_id => (
+  is => 'ro', default => sub { {} },
+  coerce => sub { +{ %{$_[0]} } }, # shallow clone on the way in
+);
 
-has remote_objects_by_id => (is => 'ro', default => sub { {} });
+has remote_objects_by_id => (
+  is => 'ro', default => sub { {} },
+  coerce => sub { +{ %{$_[0]} } }, # shallow clone on the way in
+);
 
 has outstanding_futures => (is => 'ro', default => sub { {} });
 
@@ -83,6 +89,7 @@ BEGIN {
   eval { require Object::Remote::Connector::Local };
   eval { require Object::Remote::Connector::LocalSudo };
   eval { require Object::Remote::Connector::SSH };
+  eval { require Object::Remote::Connector::UNIX };
 }
 
 sub new_from_spec {
@@ -94,7 +101,7 @@ sub new_from_spec {
   die "Couldn't figure out what to do with ${spec}";
 }
 
-sub new_remote {
+sub remote_object {
   my ($self, @args) = @_;
   Object::Remote::Handle->new(
     connection => $self, @args
@@ -108,7 +115,7 @@ sub connect {
   ));
 }
 
-sub get_remote_sub {
+sub remote_sub {
   my ($self, $sub) = @_;
   my ($pkg, $name) = $sub =~ m/^(.*)::([^:]+)$/;
   return await_future($self->send(class_call => $pkg, 0, can => $name));
@@ -211,7 +218,9 @@ sub _receive_data_from {
   my ($self, $fh) = @_;
   my $rb = $self->_receive_data_buffer;
   my $ready = $self->ready_future->is_ready;
-  if (sysread($fh, $$rb, 1024, length($$rb)) > 0) {
+  my $len = sysread($fh, $$rb, 1024, length($$rb));
+  my $err = defined($len) ? undef : ": $!";
+  if (defined($len) and $len > 0) {
     while ($$rb =~ s/^(.*)\n//) {
       if ($ready) {
         $self->_receive($1);
@@ -229,7 +238,7 @@ sub _receive_data_from {
                       on_read_ready => 1
                     );
     my $outstanding = $self->outstanding_futures;
-    $_->fail("Connection lost") for values %$outstanding;
+    $_->fail("Connection lost${err}") for values %$outstanding;
     %$outstanding = ();
     $self->on_close->done();
   }