File Coverage

blib/lib/Sub/Meta/Library.pm
Criterion Covered Total %
statement 58 58 100.0
branch 16 16 100.0
condition 15 15 100.0
subroutine 14 14 100.0
pod 7 7 100.0
total 110 110 100.0


line stmt bran cond sub pod time code
1             package Sub::Meta::Library;
2 2     2   1008 use 5.010;
  2         8  
3 2     2   12 use strict;
  2         4  
  2         40  
4 2     2   11 use warnings;
  2         14  
  2         82  
5              
6             our $VERSION = "0.13";
7              
8 2     2   12 use Scalar::Util ();
  2         4  
  2         54  
9 2     2   10 use Sub::Meta;
  2         4  
  2         37  
10 2     2   10 use Sub::Identify;
  2         3  
  2         1310  
11              
12             my %INFO;
13             my %INDEX;
14              
15 11     11   64 sub _croak { require Carp; goto &Carp::croak }
  11         1179  
16              
17             sub register {
18 15     15 1 3220 my ($class, $sub, $meta) = @_;
19 15 100 100     66 unless ($sub && $meta) {
20 2         6 _croak "arguments required coderef and submeta.";
21             }
22              
23 13 100 100     48 unless (ref $sub && ref $sub eq 'CODE') {
24 3         14 _croak "required coderef: $sub";
25             }
26              
27 10 100 100     60 unless (Scalar::Util::blessed($meta) && $meta->isa('Sub::Meta')) {
28 2         9 _croak "required an instance of Sub::Meta: $meta";
29             }
30              
31 8         22 my $id = Scalar::Util::refaddr $sub;
32 8         25 my ($stash, $subname) = Sub::Identify::get_code_info($sub);
33 8         22 $INDEX{$stash}{$subname} = $id;
34 8         14 $INFO{$id} = $meta;
35 8         26 return;
36             }
37              
38             sub register_list {
39 7     7 1 1373 my ($class, @list) = @_;
40              
41 7         17 for (@list) {
42 11         40 $class->register(@$_)
43             }
44 3         7 return;
45             }
46              
47             sub get {
48 7     7 1 1322 my ($class, $sub) = @_;
49              
50 7 100 100     39 unless (ref $sub && ref $sub eq 'CODE') {
51 2         8 _croak "required coderef: $sub";
52             }
53              
54 5         15 my $id = Scalar::Util::refaddr $sub;
55 5         27 return $INFO{$id}
56             }
57              
58             sub get_by_stash_subname {
59 4     4 1 406 my ($class, $stash, $subname) = @_;
60              
61 4         11 my $id = $INDEX{$stash}{$subname};
62 4 100       18 return $INFO{$id} if $id;
63 2         7 return;
64             }
65              
66             sub get_all_subnames_by_stash {
67 3     3 1 291 my ($class, $stash) = @_;
68              
69 3         8 my $data = $INDEX{$stash};
70 3 100       21 return [ sort keys %$data ] if $data;
71 1         5 return [ ]
72             }
73              
74             sub get_all_submeta_by_stash {
75 3     3 1 6939 my ($class, $stash) = @_;
76              
77 3         7 my $data = $INDEX{$stash};
78 3 100       14 return [ map { $INFO{$data->{$_}} } sort keys %$data ] if $data;
  4         18  
79 1         5 return [ ]
80             }
81              
82             sub remove {
83 3     3 1 5851 my ($class, $sub) = @_;
84              
85 3 100 100     19 unless (ref $sub && ref $sub eq 'CODE') {
86 2         9 _croak "required coderef: $sub";
87             }
88              
89 1         6 my $id = Scalar::Util::refaddr $sub;
90 1         7 return delete $INFO{$id}
91             }
92              
93             1;
94             __END__