File Coverage

blib/lib/pluskeys.pm
Criterion Covered Total %
statement 35 35 100.0
branch 2 4 50.0
condition n/a
subroutine 11 11 100.0
pod n/a
total 48 50 96.0


line stmt bran cond sub pod time code
1             package pluskeys;
2              
3 2     2   31200 use strict;
  2         4  
  2         48  
4 2     2   5 use warnings;
  2         3  
  2         50  
5              
6 2     2   9 use Carp;
  2         9  
  2         296  
7              
8             our($VERSION) = q($Revision: 2.4 $) =~ / \b ( \d+ (?: \. \d+ )+ ) \b /x;
9              
10             my $My_Package = __PACKAGE__;
11              
12             sub import {
13 4     4   3249 shift; # discard "pluskeys" invocant
14              
15             #################################################################
16             # Create named constants in caller's package so they
17             # can be used to access munged member names with +NAME
18             # which both catches typos and adds package-name munging so
19             # that more than one class in a hierarchy can have a key
20             # with the same name.
21             #
22             # Must be called from a BEGIN block to do any good. That's
23             # why it is a use statement, since that has a BEGIN blocked
24             # wrapped around it.
25             #################################################################
26              
27 4         20 for my $member (@_) {
28             # Has to start with a letter or an underscore, and be one
29             # or more identifier characters long and nothing else.
30 2 50   2   1005 $member =~ / ^ (?= [\p{Letter}_] ) \w+ $ /x
  2         15  
  2         21  
  5         20  
31             || croak "Bad pluskey: '$member' is not a valid identifier";
32              
33 5         13 my $his_package = caller;
34              
35 5 50   1   309 eval <<"MAKE_A_MEMBER_CONSTANT" || croak "member init of $member failed: $@";
  1     1   5  
  1     1   1  
  1     1   3  
  1     1   10  
  1         1  
  1         2  
  1         4  
  1         1  
  1         1  
  1         4  
  1         1  
  1         3  
  1         4  
  1         1  
  1         3  
36             package $his_package;
37             use constant $member => ${My_Package}::_mk_safe_member('$member');
38             1;
39             MAKE_A_MEMBER_CONSTANT
40             }
41             }
42              
43             sub _mk_safe_member($) {
44 5     5   6 my($member_name) = @_;
45 5         10 my $his_package = caller;
46 5         296 return $his_package . "::" . $member_name;
47             }
48              
49             1;
50              
51             __END__