File Coverage

blib/lib/IO/Socket/ByteCounter.pm
Criterion Covered Total %
statement 50 53 94.3
branch 5 14 35.7
condition n/a
subroutine 12 12 100.0
pod 1 4 25.0
total 68 83 81.9


line stmt bran cond sub pod time code
1             package IO::Socket::ByteCounter;
2              
3 2     2   128386 use base 'IO::Socket';
  2         4  
  2         1890  
4              
5 2     2   56514 use strict;
  2         4  
  2         66  
6             # use warnings;
7              
8 2     2   1874 use version;our $VERSION = qv('0.0.2');
  2         4444  
  2         10  
9              
10             sub import {
11 2 50   2   32 shift->record_bytes(@_) if @_;
12             }
13              
14             sub record_bytes {
15 4     4 1 92 my ($self, @pkgs) = @_;
16              
17 4         10 for my $pkg (@pkgs) {
18 2 50       10 $pkg = ref $pkg if ref $pkg;
19            
20 2         4 my $inc = $pkg;
21 2         14 $inc =~ s{::}{/}g;
22 2 50       12 if(!exists $INC{$inc . '.pm'}) {
23 0         0 eval "use $pkg;";
24 0 0       0 warn $@ if $@;
25 0 0       0 next if $@;
26             }
27            
28 2     2   394 no strict;
  2         2  
  2         362  
29 2 50       4 next if ${ "$pkg\::io_socket_bytecounter_on" };
  2         20  
30            
31 2     2 0 788 eval <<"OVERRIDE_END";
  2     1 0 2530  
  2     1 0 24  
  2     1   71  
  2         35  
  2         1075  
  2         12  
  2         39  
  2         12  
  1         5  
  1         3  
  1         11  
  1         113  
  1         2  
  1         27  
  1         4  
  1         2  
  1         13  
  1         13  
32             \$$pkg\::io_socket_bytecounter_on = 1;
33            
34             #### IO::Socket methods ##
35             # IO::Socket::send
36             my \$send = \\&$pkg\::send;
37             \*$pkg\::send = sub {
38             my \$self = \$_[0];
39             \${\*\$self}{'io_socket_bytecounter_out'} += IO::Socket::ByteCounter->_get_byte_size(\$_[1]);
40             \$send->(\@_);
41             };
42            
43             # IO::Socket::recv
44             my \$recv = \\&$pkg\::recv;
45             \*$pkg\::recv = sub {
46             my \$self = \$_[0];
47             \${\*\$self}{'io_socket_bytecounter_in'} += \$_[2];
48             \$recv->(\@_);
49             };
50            
51             #### IO::Handle methods ##
52            
53            
54             #### new methods ##
55            
56             sub $pkg\::get_bytes_in {
57             my \$self = \$_[0];
58             \${\*\$self}{'io_socket_bytecounter_in'};
59             }
60              
61             sub $pkg\::get_bytes_out {
62             my \$self = \$_[0];
63             \${\*\$self}{'io_socket_bytecounter_out'};
64             }
65            
66             sub $pkg\::get_bytes_total {
67             my \$self = \$_[0];
68             \${\*\$self}{'io_socket_bytecounter_in'} + \${\*\$self}{'io_socket_bytecounter_out'};
69             }
70              
71             OVERRIDE_END
72             }
73              
74 4 50       48 return $@ ? 0 : 1;
75             }
76              
77             sub _get_byte_size {
78 2     2   33 my($self, @strings) = @_;
79 2         6 my $bytes = 0;
80            
81             {
82 2     2   3058 use bytes;
  2         20  
  2         10  
  2         8  
83 2         18 for my $string (@strings) {
84 2         26 $bytes += length($string);
85             }
86             }
87            
88 2         65 return $bytes;
89             }
90              
91             1;
92              
93             __END__