File Coverage

blib/lib/autovivification.pm
Criterion Covered Total %
statement 26 26 100.0
branch 4 4 100.0
condition 4 4 100.0
subroutine 7 7 100.0
pod n/a
total 41 41 100.0


line stmt bran cond sub pod time code
1             package autovivification;
2              
3 15     15   527735 use 5.008_003;
  15         61  
4              
5 15     15   86 use strict;
  15         37  
  15         370  
6 15     15   86 use warnings;
  15         40  
  15         847  
7              
8             =head1 NAME
9              
10             autovivification - Lexically disable autovivification.
11              
12             =head1 VERSION
13              
14             Version 0.17
15              
16             =cut
17              
18             our $VERSION;
19             BEGIN {
20 15     15   755 $VERSION = '0.17';
21             }
22              
23             =head1 SYNOPSIS
24              
25             no autovivification;
26              
27             my $hashref;
28              
29             my $a = $hashref->{key_a}; # $hashref stays undef
30              
31             if (exists $hashref->{option}) { # Still undef
32             ...
33             }
34              
35             delete $hashref->{old}; # Still undef again
36              
37             $hashref->{new} = $value; # Vivifies to { new => $value }
38              
39             =head1 DESCRIPTION
40              
41             When an undefined variable is dereferenced, it gets silently upgraded to an array or hash reference (depending of the type of the dereferencing).
42             This behaviour is called I<autovivification> and usually does what you mean (e.g. when you store a value) but it may be unnatural or surprising because your variables gets populated behind your back.
43             This is especially true when several levels of dereferencing are involved, in which case all levels are vivified up to the last, or when it happens in intuitively read-only constructs like C<exists>.
44              
45             This pragma lets you disable autovivification for some constructs and optionally throws a warning or an error when it would have happened.
46              
47             =cut
48              
49             BEGIN {
50 15     15   99 require XSLoader;
51 15         11964 XSLoader::load(__PACKAGE__, $VERSION);
52             }
53              
54             =head1 METHODS
55              
56             =head2 C<unimport>
57              
58             no autovivification; # defaults to qw<fetch exists delete>
59             no autovivification qw<fetch store exists delete>;
60             no autovivification 'warn';
61             no autovivification 'strict';
62              
63             Magically called when C<no autovivification @opts> is encountered.
64             Enables the features given in C<@opts>, which can be :
65              
66             =over 4
67              
68             =item *
69              
70             C<'fetch'>
71              
72             Turns off autovivification for rvalue dereferencing expressions, such as :
73              
74             $value = $arrayref->[$idx]
75             $value = $hashref->{$key}
76             keys %$hashref
77             values %$hashref
78              
79             Starting from perl C<5.11>, it also covers C<keys> and C<values> on array references :
80              
81             keys @$arrayref
82             values @$arrayref
83              
84             When the expression would have autovivified, C<undef> is returned for a plain fetch, while C<keys> and C<values> return C<0> in scalar context and the empty list in list context.
85              
86             =item *
87              
88             C<'exists'>
89              
90             Turns off autovivification for dereferencing expressions that are parts of an C<exists>, such as :
91              
92             exists $arrayref->[$idx]
93             exists $hashref->{$key}
94              
95             C<''> is returned when the expression would have autovivified.
96              
97             =item *
98              
99             C<'delete'>
100              
101             Turns off autovivification for dereferencing expressions that are parts of a C<delete>, such as :
102              
103             delete $arrayref->[$idx]
104             delete $hashref->{$key}
105              
106             C<undef> is returned when the expression would have autovivified.
107              
108             =item *
109              
110             C<'store'>
111              
112             Turns off autovivification for lvalue dereferencing expressions, such as :
113              
114             $arrayref->[$idx] = $value
115             $hashref->{$key} = $value
116             for ($arrayref->[$idx]) { ... }
117             for ($hashref->{$key}) { ... }
118             function($arrayref->[$idx])
119             function($hashref->{$key})
120              
121             An exception is thrown if vivification is needed to store the value, which means that effectively you can only assign to levels that are already defined.
122             In the example, this would require C<$arrayref> (resp. C<$hashref>) to already be an array (resp. hash) reference.
123              
124             =item *
125              
126             C<'warn'>
127              
128             Emits a warning when an autovivification is avoided.
129              
130             =item *
131              
132             C<'strict'>
133              
134             Throws an exception when an autovivification is avoided.
135              
136             =back
137              
138             Each call to C<unimport> B<adds> the specified features to the ones already in use in the current lexical scope.
139              
140             When C<@opts> is empty, it defaults to C<< qw<fetch exists delete> >>.
141              
142             =cut
143              
144             my %bits = (
145             strict => A_HINT_STRICT,
146             warn => A_HINT_WARN,
147             fetch => A_HINT_FETCH|A_HINT_KEYS|A_HINT_VALUES,
148             store => A_HINT_STORE,
149             exists => A_HINT_EXISTS,
150             delete => A_HINT_DELETE,
151             );
152              
153             sub unimport {
154 20463     20463   5971391 shift;
155 20463   100     112905 my $hint = _detag($^H{+(__PACKAGE__)}) || 0;
156 20463 100       64479 @_ = qw<fetch exists delete> unless @_;
157 20463         90093 $hint |= $bits{$_} for grep exists $bits{$_}, @_;
158 20463         50282 $^H |= 0x00020000;
159 20463         93152 $^H{+(__PACKAGE__)} = _tag($hint);
160 20463         1792005 ();
161             }
162              
163             =head2 C<import>
164              
165             use autovivification; # default Perl behaviour
166             use autovivification qw<fetch store exists delete>;
167              
168             Magically called when C<use autovivification @opts> is encountered.
169             Disables the features given in C<@opts>, which can be the same as for L</unimport>.
170              
171             Each call to C<import> B<removes> the specified features to the ones already in use in the current lexical scope.
172              
173             When C<@opts> is empty, it defaults to restoring the original Perl autovivification behaviour.
174              
175             =cut
176              
177             sub import {
178 109     109   23269 shift;
179 109         181 my $hint = 0;
180 109 100       270 if (@_) {
181 108   100     486 $hint = _detag($^H{+(__PACKAGE__)}) || 0;
182 108         510 $hint &= ~$bits{$_} for grep exists $bits{$_}, @_;
183             }
184 109         266 $^H |= 0x00020000;
185 109         441 $^H{+(__PACKAGE__)} = _tag($hint);
186 109         11749 ();
187             }
188              
189             =head1 CONSTANTS
190              
191             =head2 C<A_THREADSAFE>
192              
193             True if and only if the module could have been built with thread-safety features enabled.
194             This constant only has a meaning when your perl is threaded, otherwise it will always be false.
195              
196             =head2 C<A_FORKSAFE>
197              
198             True if and only if this module could have been built with fork-safety features enabled.
199             This constant will always be true, except on Windows where it is false for perl 5.10.0 and below.
200              
201             =head1 CAVEATS
202              
203             Using this pragma will cause a slight global slowdown of any subsequent compilation phase that happens anywere in your code - even outside of the scope of use of C<no autovivification> - which may become noticeable if you rely heavily on numerous calls to C<eval STRING>.
204              
205             The pragma doesn't apply when one dereferences the returned value of an array or hash slice, as in C<< @array[$id]->{member} >> or C<< @hash{$key}->{member} >>.
206             This syntax is valid Perl, yet it is discouraged as the slice is here useless since the dereferencing enforces scalar context.
207             If warnings are turned on, Perl will complain about one-element slices.
208              
209             Autovivifications that happen in code C<eval>'d during the global destruction phase of a spawned thread or pseudo-fork (the processes used internally for the C<fork> emulation on Windows) are not reported.
210              
211             =head1 DEPENDENCIES
212              
213             L<perl> 5.8.3.
214              
215             A C compiler.
216             This module may happen to build with a C++ compiler as well, but don't rely on it, as no guarantee is made in this regard.
217              
218             L<XSLoader> (standard since perl 5.6.0).
219              
220             =head1 SEE ALSO
221              
222             L<perlref>.
223              
224             =head1 AUTHOR
225              
226             Vincent Pit, C<< <perl at profvince.com> >>, L<http://www.profvince.com>.
227              
228             You can contact me by mail or on C<irc.perl.org> (vincent).
229              
230             =head1 BUGS
231              
232             Please report any bugs or feature requests to C<bug-autovivification at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=autovivification>.
233             I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
234              
235             =head1 SUPPORT
236              
237             You can find documentation for this module with the perldoc command.
238              
239             perldoc autovivification
240              
241             =head1 ACKNOWLEDGEMENTS
242              
243             Matt S. Trout asked for it.
244              
245             =head1 COPYRIGHT & LICENSE
246              
247             Copyright 2009,2010,2011,2012,2013,2014,2015,2017 Vincent Pit, all rights reserved.
248              
249             This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
250              
251             =cut
252              
253             1; # End of autovivification