File Coverage

blib/lib/Constant/FromGlobal.pm
Criterion Covered Total %
statement 57 57 100.0
branch 18 18 100.0
condition 6 6 100.0
subroutine 13 13 100.0
pod n/a
total 94 94 100.0


line stmt bran cond sub pod time code
1             package Constant::FromGlobal;
2             $Constant::FromGlobal::VERSION = '0.10';
3             # ABSTRACT: declare constant(s) with value from global or environment variable
4              
5 5     5   358375 use strict;
  5         46  
  5         158  
6 5     5   28 use warnings;
  5         10  
  5         177  
7 5     5   109 use 5.8.0;
  5         27  
8 5     5   28 use Carp;
  5         25  
  5         323  
9 5     5   2589 use Data::OptList;
  5         52922  
  5         43  
10 5     5   192 use constant ();
  5         12  
  5         2566  
11              
12             sub import {
13 15     15   3117 my ( $class, @args ) = @_;
14              
15 15 100       62 my $opt = ref($args[0]) eq 'HASH' ? shift @args : {};
16              
17 15         84 @_ = (
18             "constant",
19             $class->_process_constants(
20             package => scalar(caller),
21             %$opt,
22             constants => \@args
23             )
24             );
25              
26 13         9290 goto &constant::import;
27             }
28              
29             sub _process_constants {
30 15     15   64 my ( $class, %args ) = @_;
31              
32 15         74 my $options = Data::OptList::mkopt(delete $args{constants}, "constant", 1, [qw(HASH ARRAY)]);
33              
34 15         1057 my $constants = {};
35              
36 15         31 my $caller = $args{package};
37              
38 15         34 foreach my $constant ( @$options ) {
39 26         58 my ( $name, $opt ) = @$constant;
40              
41 26         144 $constants->{$name} = $class->_get_value(
42             %args,
43             name => $name,
44             %$opt,
45             );
46             }
47              
48 13         51 return $constants;
49             }
50              
51             sub _get_value {
52 26     26   79 my ( $class, %args ) = @_;
53              
54 26         75 my $value = $class->_get_var(%args);
55              
56 26 100 100     140 if ( not defined $value and $args{env} ) {
57 20         53 $value = $class->_get_env_var(%args);
58             }
59              
60 26 100 100     84 if ( not defined $value and defined $args{default} ) {
61 4         9 $value = $args{default};
62             }
63              
64 26 100       78 if ( $args{bool} ) {
    100          
65 8         39 return not not $value;
66             } elsif ( defined $value ) {
67 17 100       50 if ( $args{num} ) {
    100          
68 5         20 require Scalar::Util;
69 5 100       243 croak "'$value' does not look like a number" unless Scalar::Util::looks_like_number($value);
70 4         24 return 0+$value;
71             } elsif ( $args{int} ) {
72 7 100       279 croak "'$value' does not look like an integer" unless $value =~ /^\s* -? \d+ \s*$/x;
73 6         36 return int 0+$value;
74             }
75             }
76              
77 6         27 return $value;
78             }
79              
80             sub _var_name {
81 46     46   123 my ( $class, %args ) = @_;
82              
83 46         334 join "::", @args{qw(package name)};
84             }
85              
86             sub _get_var {
87 26     26   68 my ( $class, %args ) = @_;
88              
89 5     5   42 no strict 'refs';
  5         10  
  5         796  
90 26         40 return ${ $class->_var_name(%args) }
  26         64  
91             }
92              
93             sub _get_env_var {
94 20     20   54 my ( $class, %args ) = @_;
95              
96 20         50 my $name = uc $class->_var_name(%args);
97 20         79 $name =~ s/^MAIN:://;
98 20         53 $name =~ s/::/_/g;
99              
100 20         67 $ENV{$name};
101             }
102              
103             # ex: set sw=4 et:
104              
105             __PACKAGE__
106              
107             __END__