File Coverage

blib/lib/RPC/Object.pm
Criterion Covered Total %
statement 18 46 39.1
branch 0 10 0.0
condition n/a
subroutine 6 9 66.6
pod 0 1 0.0
total 24 66 36.3


line stmt bran cond sub pod time code
1             package RPC::Object;
2 1     1   16281 use strict;
  1         2  
  1         27  
3 1     1   3 use warnings;
  1         1  
  1         27  
4 1     1   4 use Carp;
  1         6  
  1         66  
5 1     1   512 use IO::Socket::INET;
  1         20251  
  1         5  
6 1     1   1095 use Storable qw(thaw nfreeze);
  1         2922  
  1         63  
7 1     1   430 use RPC::Object::Common;
  1         8  
  1         529  
8            
9             our $VERSION = '0.00_01';
10             $VERSION = eval $VERSION;
11            
12             sub new {
13 0     0 0   my $class = shift;
14 0           my $url = shift;
15 0           my ($host, $port) = $url =~ m{([^:]+):(\d+)};
16 0           my $obj = _invoke($host, $port, @_);
17 0           my $self = {
18             host => $host,
19             port => $port,
20             object => $obj,
21             };
22 0           return bless $self, $class;
23             }
24            
25             sub AUTOLOAD {
26 0     0     my $self = shift;
27 0           my $name = (split '::', our $AUTOLOAD)[-1];
28 0 0         return if $name eq 'DESTROY';
29 0           return _invoke($self->{host}, $self->{port}, $name, $self->{object}, @_);
30             }
31            
32             sub _invoke {
33 0     0     my $host = shift;
34 0           my $port = shift;
35 0           my $sock = IO::Socket::INET->new(PeerAddr => $host,
36             PeerPort => $port,
37             Proto => 'tcp',
38             Type => SOCK_STREAM,
39             );
40 0           binmode $sock;
41 0 0         print {$sock} nfreeze([wantarray ? WANT_LIST : WANT_SCALAR, @_]);
  0            
42 0           $sock->shutdown(1);
43 0           my $res = do { local $/; <$sock> };
  0            
  0            
44 0           $sock->close();
45 0           my ($stat, @ret) = @{thaw($res)};
  0            
46 0 0         if ($stat eq RESPONSE_ERROR) {
    0          
47 0           croak @ret;
48             }
49             elsif ($stat eq RESPONSE_NORMAL) {
50 0 0         return wantarray ? @ret : $ret[0];
51             }
52             else {
53 0           croak "Unknown response";
54             }
55 0           return;
56             }
57            
58             1;
59             __END__