File Coverage

blib/lib/define.pm
Criterion Covered Total %
statement 57 60 95.0
branch 16 18 88.8
condition 2 6 33.3
subroutine 12 13 92.3
pod 0 3 0.0
total 87 100 87.0


line stmt bran cond sub pod time code
1             package define;
2             $define::VERSION = '1.04';
3 2     2   1932416 use 5.006;
  2         10  
4 2     2   12 use strict;
  2         4  
  2         50  
5 2     2   115 use warnings;
  2         15  
  2         86  
6 2     2   11 use Carp qw/ carp croak /;
  2         3  
  2         4672  
7              
8             my %AllPkgs;
9             my %DefPkgs;
10             my %Vals;
11              
12             my %Forbidden = map { $_ => 1 } qw{
13             BEGIN INIT CHECK END DESTROY AUTOLOAD
14             STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG
15             };
16              
17             sub import {
18 11     11   1189 my $class = shift;
19 11         32 my $pkg = (caller)[0];
20 11 50       36 if( @_ ) {
21 11 100       28 if( ref $_[0] eq 'HASH' ) {
22 1         4 while( my( $name, $val ) = each %{$_[0]} ) {
  4         57  
23 3         10 do_import( $pkg, $name, $val );
24             }
25             }
26             else {
27 10         20 do_import( $pkg, @_ );
28             }
29             }
30             else {
31 0         0 croak "Must call 'use define' with parameters";
32             }
33             }
34              
35             sub unimport {
36 8     8   1806 my $class = shift;
37 8         22 my $pkg = (caller)[0];
38 8 100       23 if( @_ ) {
39 7         17 check_name( my $name = shift );
40 7         16 $DefPkgs{$name}{$pkg} = 1;
41 7 100       18 if( $Vals{$name} ) {
42 4         5 makedef( $pkg, $name, @{$Vals{$name}} );
  4         13  
43             }
44             else {
45 3         7 makedef( $pkg, $name );
46             }
47             }
48             else {
49             # export all Declared to pkg
50 1         2 $AllPkgs{$pkg} = 1;
51 1         7 while( my( $name, $val ) = each %Vals ) {
52             # warn "Defining ALL $pkg:$name:$val";
53 7         16 makedef( $pkg, $name, @$val );
54             }
55             }
56             }
57              
58             sub check_name {
59 20     20 0 39 my $name = shift;
60 20 50 33     327 if( $name =~ /^__/
      33        
61             or $name !~ /^_?[^\W_0-9]\w*\z/
62             or $Forbidden{$name} ) {
63 0         0 croak "Define name '$name' is invalid";
64             }
65             }
66              
67             sub do_import {
68 13     13 0 31 my( $pkg, $name, @vals ) = @_;
69 13         25 check_name( $name );
70 13         75 $DefPkgs{$name}{$pkg} = 1;
71 13         37 $Vals{$name} = [ @vals ];
72 13         29 my %pkgs = ( $pkg => 1, %AllPkgs, %{$DefPkgs{$name}} );
  13         347  
73 13         39 for (keys %pkgs) {
74 15         47 makedef( $_, $name, @vals );
75             }
76             }
77              
78             sub makedef {
79 29     29 0 147 my ($pkg, $name, @Vals) = @_;
80 29         56 my $subname = "${pkg}::$name";
81              
82 2     2   124 no strict 'refs';
  2         4  
  2         955  
83              
84 29 100       34 if (defined *{$subname}{CODE}) {
  29         365  
85 2         345 carp "Global constant $subname redefined";
86             }
87              
88 29 100       135 if (@Vals > 1) {
    100          
89 2     1   155 *$subname = sub () { @Vals };
  1         6  
90             }
91             elsif (@Vals == 1) {
92 24         71 my $val = $Vals[0];
93              
94 24 100       199 if ($val =~ /^[0-9]+$/) {
95 18         1353 *$subname = eval "sub () { $val }";
96             }
97             else {
98 6     0   547 *$subname = sub () { $val };
  0         0  
99             }
100             }
101             else {
102 3     2   243 *$subname = sub () { };
103             }
104             }
105              
106             1;
107              
108             __END__