File Coverage

blib/lib/Data/Thunk/ScalarValue.pm
Criterion Covered Total %
statement 37 39 94.8
branch n/a
condition n/a
subroutine 12 14 85.7
pod 0 1 0.0
total 49 54 90.7


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package Data::Thunk::ScalarValue;
4             BEGIN {
5 1     1   35 $Data::Thunk::ScalarValue::AUTHORITY = 'cpan:NUFFIN';
6             }
7             BEGIN {
8 1     1   22 $Data::Thunk::ScalarValue::VERSION = '0.07';
9             }
10              
11 1     1   6 use strict;
  1         1  
  1         34  
12 1     1   5 use warnings;
  1         3  
  1         57  
13              
14 1     1   6 use Carp;
  1         2  
  1         80  
15 1     1   7 use Check::ISA;
  1         2  
  1         9  
16              
17 1     1   559 use namespace::clean;
  1         3  
  1         8  
18              
19 1     1   224 use UNIVERSAL::ref;
  1         2  
  1         8  
20              
21             our $vivify_scalar;
22              
23             BEGIN {
24             $vivify_scalar = sub {
25 1     1   2 my $self = $_[0];
26              
27             # must rebless to something unoverloaded in order to get at the value
28 1         3 bless $self, "Data::Thunk::NoOverload";
29 1         3 my $val = $$self;
30 1         3 bless $self, __PACKAGE__;
31              
32             # try to replace the container with the value wherever we found it
33 1         2 local $@;
34 1         2 eval { $_[0] = $val }; # might be readonly;
  1         3  
35              
36 1         3 $val;
37 1     1   182 };
38             }
39              
40             use overload (
41 8         35 fallback => 1, map {
42 1         19 $_ => $vivify_scalar,
43             } qw( bool "" 0+ ${} @{} %{} &{} *{} )
44 1     1   7 );
  1         2  
45              
46             sub ref {
47 0     0 0 0 CORE::ref($_[0]->$vivify_scalar());
48             }
49              
50             sub AUTOLOAD {
51 1     1   8 my ( $method ) = ( our $AUTOLOAD =~ /([^:]+)$/ );
52 1         5 $_[0]->$vivify_scalar();
53 1         3 unshift @_, $method;
54 1         6 goto $Data::Thunk::Code::call_method;
55             }
56              
57 0     0     sub DESTROY { }
58              
59             1;
60              
61             __END__