File Coverage

blib/lib/Keyword/Pluggable.pm
Criterion Covered Total %
statement 50 55 90.9
branch 10 16 62.5
condition 2 4 50.0
subroutine 13 13 100.0
pod 2 2 100.0
total 77 90 85.5


line stmt bran cond sub pod time code
1             package Keyword::Pluggable;
2              
3 6     6   271596 use v5.14.0;
  6         65  
4 6     6   31 use warnings;
  6         16  
  6         298  
5             our %kw;
6              
7 6     6   50 use Carp qw(croak);
  6         12  
  6         352  
8              
9 6     6   35 use XSLoader;
  6         24  
  6         373  
10             BEGIN {
11 6     6   23 our $VERSION = '1.02';
12 6         3441 XSLoader::load __PACKAGE__, $VERSION;
13             }
14              
15             sub define {
16 8     8 1 559 my %p = @_;
17 8         30 my ($kw, $sub, $expression, $global, $package) = @p{qw(keyword code expression global package)};
18 6 50   6   3764 $kw =~ /^\p{XIDS}\p{XIDC}*\z/ or croak "'$kw' doesn't look like an identifier";
  6         88  
  6         93  
  8         57  
19 8 50       37 defined($sub) or croak "'code' is not defined";
20              
21             my $xsub = (ref($sub) eq 'CODE') ?
22 2     2   66821 sub { substr ${$_[0]}, 0, 0, $sub->(${$_[0]}) } :
  2         9  
  2         55  
23 8 100   13   44 sub { substr ${$_[0]}, 0, 0, $sub };
  13         72146  
  13         5790  
24              
25 8         23 my $entry = [ $xsub, !!$expression ];
26              
27 8 100       22 if ( defined $package) {
    100          
28 6     6   134789 no strict 'refs';
  6         15  
  6         1092  
29 2         3 my $keywords = \%{$package . '::/keywords' };
  2         7  
30 2         35 $keywords->{$kw} = $entry;
31             } elsif ( $global ) {
32 2         42 define_global($kw, $entry);
33             } else {
34 4   100     6 my %keywords = %{$^H{+HINTK_KEYWORDS} // {}};
  4         31  
35 4         13 $keywords{$kw} = $entry;
36 4         88 $^H{+HINTK_KEYWORDS} = \%keywords;
37             }
38             }
39              
40             sub undefine {
41 1     1 1 1409 my %p = @_;
42 1         5 my ($kw, $global, $package) = @p{qw(keyword global package)};
43 1 50       9 $kw =~ /^\p{XIDS}\p{XIDC}*\z/ or croak "'$kw' doesn't look like an identifier";
44              
45 1 50       4 if ( defined $package ) {
    0          
46 6     6   1503 no strict 'refs';
  6         14  
  6         872  
47 1         2 my $keywords = \%{$package . '::/keywords' };
  1         7  
48 1         11 delete $keywords->{$kw};
49             } elsif ( $global ) {
50 0           undefine_global($kw);
51             } else {
52 0   0       my %keywords = %{$^H{+HINTK_KEYWORDS} // {}};
  0            
53 0           delete $keywords{$kw};
54 0           $^H{+HINTK_KEYWORDS} = \%keywords;
55             }
56             }
57              
58 6     6   11220 END { cleanup() }
59              
60             'ok'
61              
62             __END__