File Coverage

blib/lib/Sub/Meta/Library.pm
Criterion Covered Total %
statement 54 54 100.0
branch 8 8 100.0
condition n/a
subroutine 14 14 100.0
pod 7 7 100.0
total 83 83 100.0


line stmt bran cond sub pod time code
1             package Sub::Meta::Library;
2 7     7   1996 use 5.010;
  7         25  
3 7     7   42 use strict;
  7         14  
  7         139  
4 7     7   34 use warnings;
  7         13  
  7         273  
5              
6             our $VERSION = "0.14";
7              
8 7     7   38 use Scalar::Util ();
  7         14  
  7         125  
9 7     7   827 use Sub::Identify;
  7         2005  
  7         427  
10 7     7   3604 use Types::Standard qw(InstanceOf Str Ref);
  7         591364  
  7         94  
11 7     7   11809 use Type::Params qw(compile Invocant);
  7         70576  
  7         110  
12              
13             our %INFO;
14             our %INDEX;
15              
16             my $SubMeta = InstanceOf['Sub::Meta'];
17             my $Callable = Ref['CODE'];
18              
19             sub register {
20 25     25 1 11924 state $check = compile(Invocant, $Callable, $SubMeta);
21 25         33524 my ($class, $sub, $meta) = $check->(@_);
22              
23 18         460 my $id = Scalar::Util::refaddr $sub;
24 18         94 my ($stash, $subname) = Sub::Identify::get_code_info($sub);
25 18         68 $INDEX{$stash}{$subname} = $id;
26 18         67 $INFO{$id} = $meta;
27 18         45 return;
28             }
29              
30             sub register_list {
31 7     7 1 1708 my ($class, @list) = @_;
32              
33 7         16 for (@list) {
34 11         41 $class->register(@$_)
35             }
36 3         11 return;
37             }
38              
39             sub get {
40 30     30 1 546 my ($class, $sub) = @_;
41 30 100       132 return unless $Callable->check($sub);
42              
43 27         347 my $id = Scalar::Util::refaddr $sub;
44 27         121 return $INFO{$id}
45             }
46              
47             sub get_by_stash_subname {
48 4     4 1 305 my ($class, $stash, $subname) = @_;
49              
50 4         10 my $id = $INDEX{$stash}{$subname};
51 4 100       19 return $INFO{$id} if $id;
52 2         10 return;
53             }
54              
55             sub get_all_subnames_by_stash {
56 3     3 1 291 my ($class, $stash) = @_;
57              
58 3         8 my $data = $INDEX{$stash};
59 3 100       27 return [ sort keys %$data ] if $data;
60 1         4 return [ ]
61             }
62              
63             sub get_all_submeta_by_stash {
64 3     3 1 10490 my ($class, $stash) = @_;
65              
66 3         7 my $data = $INDEX{$stash};
67 3 100       15 return [ map { $INFO{$data->{$_}} } sort keys %$data ] if $data;
  4         18  
68 1         4 return [ ]
69             }
70              
71             sub remove {
72 3     3 1 5962 state $check = compile(Invocant, $Callable);
73 3         1283 my ($class, $sub) = $check->(@_);
74              
75 1         26 my $id = Scalar::Util::refaddr $sub;
76 1         14 my ($stash, $subname) = Sub::Identify::get_code_info($sub);
77 1         3 delete $INDEX{$stash}{$subname};
78 1         17 return delete $INFO{$id}
79             }
80              
81             1;
82             __END__