File Coverage

blib/lib/PerlX/SafeNav.pm
Criterion Covered Total %
statement 43 45 95.5
branch 2 2 100.0
condition n/a
subroutine 16 18 88.8
pod 1 1 100.0
total 62 66 93.9


line stmt bran cond sub pod time code
1             package PerlX::SafeNav;
2 5     5   912640 use strict;
  5         34  
  5         145  
3 5     5   24 use warnings;
  5         10  
  5         188  
4             our $VERSION = '0.003';
5              
6 5     5   25 use Exporter 'import';
  5         10  
  5         1273  
7              
8             our @EXPORT = ('$safenav', '$unsafenav');
9             our @EXPORT_OK = ('&safenav');
10              
11             our $safenav = sub {
12 41     41   14733 my $o = shift;
13 41         209 bless \$o, 'PerlX::SafeNav::Object';
14             };
15              
16             our $unsafenav = sub {
17 11     11   19 ${ $_[0] }
  11         56  
18             };
19              
20             sub safenav (&@) {
21 5     5 1 13145 my ($block, $o) = @_;
22 5         13 local $_ = $o->$safenav;
23 5         17 $block->()->$unsafenav;
24             }
25              
26             package PerlX::SafeNav::Object;
27              
28             use overload
29             '@{}' => sub {
30 16     16   33 my $self = shift;
31 16         55 tie my @a, 'PerlX::SafeNav::ArrayRef', $$self;
32 16         87 return \@a;
33             },
34             '%{}' => sub {
35 18     18   39 my $self = shift;
36 18         58 tie my %h, 'PerlX::SafeNav::HashRef', $$self;
37 18         77 return \%h;
38 5     5   36 };
  5         12  
  5         81  
39              
40             sub AUTOLOAD {
41 44     44   106 our $AUTOLOAD;
42 44         122 my $method = substr $AUTOLOAD, 2 + rindex($AUTOLOAD, '::');
43              
44 44         85 my ($self, @args) = @_;
45              
46 44 100       253 (defined $$self) ?
47             $$self -> $method(@args) -> $safenav :
48             $self;
49             }
50              
51       0     sub DESTROY {}
52              
53             package PerlX::SafeNav::ArrayRef;
54 5     5   3148 use Tie::Array;
  5         6094  
  5         680  
55             our @ISA = ('Tie::Array');
56              
57             sub TIEARRAY {
58 16     16   54 my ($class, $o) = @_;
59 16         45 return bless \$o, $class;
60             }
61              
62             sub FETCH {
63 16     16   38 my ($self, $i) = @_;
64 16         51 @$$self[$i] -> $safenav;
65             }
66              
67             sub FETCHSIZE {
68 0     0   0 my ($self) = @_;
69 0         0 @$$self
70             }
71              
72             package PerlX::SafeNav::HashRef;
73 5     5   47 use Tie::Hash;
  5         12  
  5         613  
74             our @ISA = ('Tie::Hash');
75              
76             sub TIEHASH {
77 18     18   38 my ($class, $o) = @_;
78 18         37 bless \$o, $class;
79             }
80              
81             sub FETCH {
82 18     18   34 my ($self, $k) = @_;
83 18         64 $$self->{$k} -> $safenav;
84             }
85              
86             1;
87              
88             __END__