File Coverage

blib/lib/Acme/CXW/vars/i.pm
Criterion Covered Total %
statement 51 51 100.0
branch 28 28 100.0
condition 3 3 100.0
subroutine 3 3 100.0
pod n/a
total 85 85 100.0


line stmt bran cond sub pod time code
1             # I basically took vars.pm, and turned it into vars/i.pm
2            
3             package Acme::CXW::vars::i;
4 3     3   202448 use 5.006;
  3         30  
5            
6             our $VERSION = '1.04'; # TRIAL
7            
8             # yuck
9             =for IT DOESN'T WORK nor is it important (try perl -Mstrict -Mwarnings=all -We"use vars q[$a];")
10             BEGIN {
11             eval q{
12             use warnings::register;
13             };
14             eval q{
15             sub warnings::enabled { return $^W; }
16             } if $@;
17             }
18             =cut
19            
20 3     3   18 use strict qw(vars subs);
  3         7  
  3         2109  
21            
22             sub import {
23 23 100   23   12593 return if @_ < 2;
24 20         60 my( $pack, $var, @value ) = @_;
25 20         43 my $callpack = caller;
26            
27 20         32 my %stuff;
28            
29 20 100       51 if( not @value ){
30 4 100       13 if( ref $var ){
31 3         10 %stuff = @$var;
32             } else {
33 1         49 return; # No value given --- no-op; not an error.
34             }
35             } else {
36 16         65 %stuff = ( $var, [@value] );
37             }
38            
39 19         58 for my $k( keys %stuff ){
40 20         35 $var = $k;
41 20 100       61 if( ref $stuff{$k} eq 'ARRAY' ){
    100          
42 17         26 @value = @{ $stuff{$k} };
  17         37  
43             }
44             elsif( ref $stuff{$k} eq 'HASH' ){
45 1         7 @value = %{ $stuff{$k} };
  1         4  
46             }
47             else {
48 2         5 @value = $stuff{$k};
49             }
50            
51            
52 20 100       185 if( my( $ch, $sym ) = $var =~ /^([\$\@\%\*\&])(.+)$/ ){
53 18 100 100     140 if( $sym !~ /^(\w+(::|'))+\w+$/ && $sym =~ /\W|(^\d+$)/ ){
54             # ^^ Skip fully-qualified names ^^ Check special names
55            
56             # A variable name we can't or won't handle
57 8         37 require Carp;
58            
59 8 100       44 if( $sym =~ /^\w+[[{].*[]}]$/ ){
    100          
60 2         218 Carp::croak("Can't declare individual elements of hash or array");
61             }
62             elsif( $sym =~ /^(\d+|\W|\^[\[\]A-Z\^_\?]|\{\^[a-zA-Z0-9]+\})$/ ){
63 5         526 Carp::croak("Refusing to initialize special variable $ch$sym");
64             }
65             else {
66 1         125 Carp::croak("I can't recognize $ch$sym as a variable name");
67             }
68             }
69            
70 10 100       36 $sym = "${callpack}::$sym" unless $sym =~ /::/;
71            
72 10 100       33 if( $ch eq '$' ){
    100          
    100          
    100          
73 4         18 *{$sym} = \$$sym;
  4         13  
74 4         8 (${$sym}) = @value;
  4         270  
75             }
76             elsif( $ch eq '@' ){
77 2         9 *{$sym} = \@$sym;
  2         7  
78 2         5 (@{$sym}) = @value;
  2         62  
79             }
80             elsif( $ch eq '%' ){
81 2         37 *{$sym} = \%$sym;
  2         11  
82 2         6 (%{$sym}) = @value;
  2         92  
83             }
84             elsif( $ch eq '*' ){
85 1         3 *{$sym} = \*$sym;
  1         3  
86 1         4 (*{$sym}) = shift @value;
  1         58  
87             }
88             else { # $ch eq '&'; guaranteed by the regex above.
89 1         2 *{$sym} = shift @value;
  1         30  
90             }
91             # There is no else, because the regex above guarantees
92             # that $ch has one of the values we tested.
93            
94             } else { # Name didn't match the regex above
95 2         10 require Carp;
96 2         277 Carp::croak("'$var' is not a valid variable name");
97             }
98             }
99             };
100            
101             1;
102             __END__