File Coverage

blib/lib/signatures.pm
Criterion Covered Total %
statement 61 62 98.3
branch 5 8 62.5
condition n/a
subroutine 16 16 100.0
pod 3 5 60.0
total 85 91 93.4


line stmt bran cond sub pod time code
1 8     8   447175 use strict;
  8         67  
  8         201  
2 8     8   31 use warnings;
  8         12  
  8         350  
3             package signatures; # git description: v0.13-13-gf19ea86
4             # ABSTRACT: Subroutine signatures with no source filter
5              
6             our $VERSION = '0.14';
7              
8 8     8   40 use XSLoader;
  8         24  
  8         240  
9 8     8   3026 use B::Hooks::Parser 0.12;
  8         15271  
  8         222  
10 8     8   43 use B::Hooks::OP::Check 0.17;
  8         83  
  8         147  
11 8     8   3002 use B::Hooks::OP::PPAddr 0.03;
  8         3063  
  8         217  
12 8     8   3059 use B::Hooks::EndOfScope 0.08 ();
  8         73168  
  8         3214  
13              
14             XSLoader::load(
15             __PACKAGE__,
16             $VERSION,
17             );
18              
19             {
20             my %pkgs;
21              
22             sub import {
23 14     14   4814 my ($class) = @_;
24 14         32 my $caller = caller();
25 14         31 $pkgs{$caller} = $class->setup_for($caller);
26 14         497 return;
27             }
28              
29             sub unimport {
30 2     2   536 my ($class) = @_;
31 2         14 my $caller = caller();
32 2         16 $class->teardown_for(delete $pkgs{$caller});
33 2         105 return;
34             }
35             }
36              
37             sub setup_for {
38 14     14 0 30 my ($class, $caller) = @_;
39 14         213 my $ret = $class->setup($caller);
40              
41 14         72 $^H{"${class}::enabled"} = 1;
42              
43 14         62 my $old_warn = $SIG{__WARN__};
44             $SIG{__WARN__} = sub {
45 20 50   20   1048 if ($_[0] !~ /^(?:(?:Illegal character in prototype)|(?:Prototype after '.')) for /) {
46 0 0       0 $old_warn ? $old_warn->(@_) : warn @_;
47             }
48 14         71 };
49              
50 14         28 my $unregister;
51             {
52 14         17 my $called = 0;
  14         19  
53             $unregister = sub {
54 30 100   30   5566 return if $called++;
55 14         55 $class->teardown_for([$ret, $unregister]);
56 14         68 $SIG{__WARN__} = $old_warn;
57 14         38 };
58             }
59              
60 14         50 &B::Hooks::EndOfScope::on_scope_end($unregister);
61              
62 14         218 return [$ret, $unregister];
63             }
64              
65             sub teardown_for {
66 16     16 0 34 my ($class, $data) = @_;
67 16         55 delete $^H{"${class}::enabled"};
68 16         75 $class->teardown($data->[0]);
69 16         46 $data->[1]->();
70 16         31 return;
71             }
72              
73             sub callback {
74 18     18 1 49 my ($class, $offset, $proto) = @_;
75 18         95 my $inject = $class->proto_unwrap($proto);
76 18         56 $class->inject($offset, $inject);
77 18         1249 return;
78             }
79              
80             sub proto_unwrap {
81 17     17 1 33 my ($class, $proto) = @_;
82 17 100       49 return '' unless length $proto;
83 16         40 return "my ($proto) = \@_;";
84             }
85              
86             sub inject {
87 18     18 1 39 my ($class, $offset, $inject) = @_;
88 18         50 my $linestr = B::Hooks::Parser::get_linestr();
89 18         44 substr($linestr, $offset + 1, 0) = $inject;
90 18         55 B::Hooks::Parser::set_linestr($linestr);
91 18         33 return;
92             }
93              
94             1;
95              
96             __END__