File Coverage

blib/lib/Patro/N5.pm
Criterion Covered Total %
statement 42 59 71.1
branch 8 20 40.0
condition 0 3 0.0
subroutine 21 24 87.5
pod n/a
total 71 106 66.9


line stmt bran cond sub pod time code
1             package Patro::N5;
2 6     6   36 use strict;
  6         10  
  6         225  
3 6     6   37 use warnings;
  6         14  
  6         307  
4              
5             # Patro::N5. Proxy class for GLOB type references.
6              
7             # we must keep this namespace very clean <--- is this true for GLOB?
8 6     6   44 use Carp ();
  6         13  
  6         510  
9              
10             use overload
11 58     58   17609 '*{}' => sub { ${$_[0]}->{handle} },
  58         253  
12 6         159 '-X' => \&Patro::N5x::dash_X,
13             'nomethod' => \&Patro::LeumJelly::overload_handler,
14 6     6   34 ;
  6         12  
15              
16 27     27   45 sub _tied { return tied(*{${$_[0]}->{handle}}) }
  27         33  
  27         120  
17 6     6   1747 sub Patro::N5x::dash_X { return $_[0]->_tied->__('-X',1,$_[1]); }
18              
19              
20              
21             sub AUTOLOAD {
22 0     0   0 my $method = $Patro::N5::AUTOLOAD;
23 0         0 $method =~ s/.*:://;
24              
25             # is this useful with GLOB type?
26            
27 0         0 my $self = shift;
28 0         0 my $has_args = @_ > 0;
29 0         0 my $args = [ @_ ];
30              
31 0 0       0 my $context = defined(wantarray) ? 1 + wantarray : 0;
32              
33             return Patro::LeumJelly::proxy_request( $$self,
34             { id => $$self->{id},
35 0         0 topic => 'METHOD',
36             command => $method,
37             has_args => $has_args,
38             args => $args,
39             context => $context,
40             _autoload => 1 }, @_ );
41             }
42              
43             sub DESTROY {
44 0     0   0 my $self = shift;
45 0 0       0 if ($$self->{_DESTROY}++) {
46 0         0 return;
47             }
48 0         0 my $socket = $$self->{socket};
49 0 0       0 if ($socket) {
50              
51             # XXX - shouldn't disconnect on every object destruction,
52             # only when all of the wrapped objects associated with a
53             # client have been destroyed, or during global
54             # destruction
55              
56             my $response = Patro::LeumJelly::proxy_request(
57             $$self,
58             { id => $$self->{id},
59 0         0 topic => 'META',
60             #command => 'disconnect' } );
61             command => 'destroy' } );
62 0 0 0     0 if (!CORE::ref($response) || $response->{disconnect_ok}) {
63 0         0 close $socket;
64 0         0 delete $$self->{socket};
65             }
66             }
67             }
68              
69             ############################################################
70              
71             sub Patro::Tie::HANDLE::TIEHANDLE {
72 9     9   32 my ($pkg,$proxy) = @_;
73 9         47 return bless { obj => $proxy, id => $proxy->{id} }, $pkg;
74             }
75              
76             sub Patro::Tie::HANDLE::__ {
77 85     85   134 my $tied = shift;
78 85         141 my $name = shift;
79 85         110 my $context = shift;
80 85 100       182 if (!defined($context)) {
81 16 50       47 $context = defined(wantarray) ? 1 + wantarray : 0;
82             }
83             return Patro::LeumJelly::proxy_request(
84             $tied->{obj},
85             { topic => 'HANDLE',
86             command => $name,
87             context => $context,
88             has_args => @_ > 0,
89             args => [ @_ ],
90 85         679 id => $tied->{id} }, @_ );
91             }
92              
93 7 50   7   32 sub Patro::Tie::HANDLE::PRINT { return shift->__('PRINT',1,@_?@_:$_) }
94 1 50   1   5 sub Patro::Tie::HANDLE::PRINTF { return shift->__('PRINTF',1,@_?@_:$_) }
95 0     0   0 sub Patro::Tie::HANDLE::WRITE { return shift->__('WRITE',1,@_) }
96 13     13   36 sub Patro::Tie::HANDLE::READLINE { return shift->__('READLINE',undef,@_) }
97 5     5   18 sub Patro::Tie::HANDLE::GETC { return shift->__('GETC',1,@_) }
98             sub Patro::Tie::HANDLE::READ {
99 3     3   5 my $command = 'READ?';
100 3 100       12 if ($Patro::read_sysread_flag eq 'read') {
    50          
101 2         3 $command = 'READ';
102             } elsif ($Patro::read_sysread_flag eq 'sysread') {
103 1         2 $command = 'SYSREAD';
104             }
105 3         7 return shift->__($command,1,@_)
106             }
107 8     8   69 sub Patro::Tie::HANDLE::CLOSE { return shift->__('CLOSE',1,@_) }
108 3     3   7 sub Patro::Tie::HANDLE::BINMODE { return shift->__('BINMODE',1,@_) }
109 5     5   11 sub Patro::Tie::HANDLE::OPEN { return shift->__('OPEN',1,@_) }
110 2     2   64 sub Patro::Tie::HANDLE::EOF { return shift->__('EOF',1,@_) }
111 1     1   4 sub Patro::Tie::HANDLE::FILENO { return shift->__('FILENO',1,@_) }
112 2     2   6 sub Patro::Tie::HANDLE::SEEK { return shift->__('SEEK',1,@_) }
113 8     8   20 sub Patro::Tie::HANDLE::TELL { return shift->__('TELL',1,@_) }
114              
115             ############################################################
116              
117             1;