File Coverage

blib/lib/PerlX/SafeNav.pm
Criterion Covered Total %
statement 42 44 95.4
branch 2 4 50.0
condition n/a
subroutine 16 18 88.8
pod 1 1 100.0
total 61 67 91.0


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