File Coverage

blib/lib/Patro/N4.pm
Criterion Covered Total %
statement 47 61 77.0
branch 11 22 50.0
condition n/a
subroutine 18 23 78.2
pod n/a
total 76 106 71.7


line stmt bran cond sub pod time code
1             package Patro::N4;
2 7     7   42 use strict;
  7         17  
  7         230  
3 7     7   46 use warnings;
  7         18  
  7         286  
4              
5             # Patro::N4. Proxy class for ARRAY type references
6              
7             # we must keep this namespace very clean
8 7     7   37 use Carp ();
  7         11  
  7         461  
9              
10             use overload
11 112     112   16418 '@{}' => sub { ${$_[0]}->{array} },
  112         598  
12 7         127 'nomethod' => \&Patro::LeumJelly::overload_handler,
13 7     7   72 ;
  7         34  
14              
15             # override UNIVERSAL methods
16             foreach my $umethod (keys %UNIVERSAL::) {
17 7     7   415 no strict 'refs';
  7         15  
  7         5131  
18             *{$umethod} = sub {
19 3     3   10 my $proxy = shift;
20 3 100       15 if (!CORE::ref($proxy)) {
21             package
22             UNIVERSAL;
23 1         25 return &$umethod($proxy,@_);
24             }
25 2 50       11 my $context = defined(wantarray) ? 1 + wantarray : 0;
26             return Patro::LeumJelly::proxy_request( $$proxy,
27 2         28 { id => $$proxy->{id}, topic => 'METHOD', command => $umethod,
28             has_args => @_ > 0, args => [ @_ ], context => $context }, @_ );
29             };
30             }
31              
32             sub AUTOLOAD {
33 5     5   814 my $method = $Patro::N4::AUTOLOAD;
34 5         37 $method =~ s/.*:://;
35              
36 5         13 my $self = shift;
37 5         13 my $has_args = @_ > 0;
38 5         12 my $args = [ @_ ];
39              
40 5 50       18 my $context = defined(wantarray) ? 1 + wantarray : 0;
41              
42             return Patro::LeumJelly::proxy_request( $$self,
43             { id => $$self->{id},
44 5         48 topic => 'METHOD',
45             command => $method,
46             has_args => $has_args,
47             args => $args,
48             context => $context,
49             _autoload => 1 }, @_ );
50             }
51              
52             sub DESTROY {
53 0     0   0 my $self = shift;
54 0 0       0 if ($$self->{_DESTROY}++) {
55 0         0 return;
56             }
57 0         0 my $socket = $$self->{socket};
58 0 0       0 if ($socket) {
59              
60             # XXX - shouldn't disconnect on every object destruction,
61             # only when all of the wrapped objects associated with a
62             # client have been destroyed, or during global
63             # destruction
64              
65             my $response = Patro::LeumJelly::proxy_request(
66             $$self,
67             { id => $$self->{id},
68 0         0 topic => 'META',
69             #command => 'disconnect' } );
70             command => 'destroy' } );
71 0 0       0 if ($response->{disconnect_ok}) {
72 0         0 close $socket;
73 0         0 delete $$self->{socket};
74             }
75             }
76             }
77              
78             ############################################################
79              
80             # tie class for array proxy object. Operations on the proxy object
81             # are forwarded to the remote server
82              
83             sub Patro::Tie::ARRAY::TIEARRAY {
84 27     27   93 my ($pkg,$proxy) = @_;
85 27         130 return bless { obj => $proxy, id => $proxy->{id} }, $pkg;
86             }
87              
88             sub Patro::Tie::ARRAY::__ {
89 240     240   324 my $tied = shift;
90 240         292 my $name = shift;
91 240         275 my $context = shift;
92 240 50       430 if (!defined($context)) {
93 0 0       0 $context = defined(wantarray) ? 1 + wantarray : 0;
94             }
95             return Patro::LeumJelly::proxy_request( $tied->{obj},
96             { topic => 'ARRAY',
97             command => $name,
98             context => $context,
99             has_args => @_ > 0,
100             args => [ @_ ],
101 240         1501 id => $tied->{id} }, @_ );
102             }
103              
104 174     174   680 sub Patro::Tie::ARRAY::FETCH { return shift->__('FETCH',1,@_) }
105 6     6   18 sub Patro::Tie::ARRAY::STORE { return shift->__('STORE',0,@_) }
106 32     32   67 sub Patro::Tie::ARRAY::FETCHSIZE { return shift->__('FETCHSIZE',1) }
107 0     0   0 sub Patro::Tie::ARRAY::STORESIZE { return shift->__('STORESIZE',1,@_) }
108 0     0   0 sub Patro::Tie::ARRAY::DELETE { return shift->__('DELETE',1,@_) }
109 0     0   0 sub Patro::Tie::ARRAY::CLEAR { return shift->__('CLEAR',0) }
110 0     0   0 sub Patro::Tie::ARRAY::EXISTS { return shift->__('EXISTS',1,@_) }
111 4     4   17 sub Patro::Tie::ARRAY::PUSH { return shift->__('PUSH',1,@_) }
112 3     3   11 sub Patro::Tie::ARRAY::POP { return shift->__('POP',1) }
113 3     3   12 sub Patro::Tie::ARRAY::SHIFT { return shift->__('SHIFT',1) }
114 2     2   9 sub Patro::Tie::ARRAY::UNSHIFT { return shift->__('UNSHIFT',1,@_) }
115             sub Patro::Tie::ARRAY::SPLICE {
116 16     16   26 my $tied = shift;
117 16 100       29 my $off = @_ ? shift : 0;
118 16 100       23 my $len = @_ ? shift : 'undef';
119 16 100       38 return $tied->__('SPLICE',wantarray ? 2:1,$off,$len,@_);
120             }
121              
122             ############################################################
123              
124             1;