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   121311 use strict;
  8         11  
  8         257  
2 8     8   29 use warnings;
  8         8  
  8         383  
3             package signatures; # git description: v0.11-10-g01eb9b6
4             # ABSTRACT: Subroutine signatures with no source filter
5              
6             our $VERSION = '0.12';
7              
8 8     8   30 use XSLoader;
  8         8  
  8         144  
9 8     8   3476 use B::Hooks::Parser 0.12;
  8         16477  
  8         206  
10 8     8   41 use B::Hooks::OP::Check 0.17;
  8         84  
  8         142  
11 8     8   3365 use B::Hooks::OP::PPAddr 0.03;
  8         3057  
  8         204  
12 8     8   3456 use B::Hooks::EndOfScope 0.08 ();
  8         68851  
  8         3390  
13              
14             XSLoader::load(
15             __PACKAGE__,
16             $VERSION,
17             );
18              
19             {
20             my %pkgs;
21              
22             sub import {
23 14     14   4712 my ($class) = @_;
24 14         93 my $caller = caller();
25 14         36 $pkgs{$caller} = $class->setup_for($caller);
26 14         399 return;
27             }
28              
29             sub unimport {
30 2     2   288 my ($class) = @_;
31 2         4 my $caller = caller();
32 2         6 $class->teardown_for(delete $pkgs{$caller});
33 2         81 return;
34             }
35             }
36              
37             sub setup_for {
38 14     14 0 18 my ($class, $caller) = @_;
39 14         208 my $ret = $class->setup($caller);
40              
41 14         55 $^H{"${class}::enabled"} = 1;
42              
43 14         29 my $old_warn = $SIG{__WARN__};
44             $SIG{__WARN__} = sub {
45 20 50   20   775 if ($_[0] !~ /^(?:(?:Illegal character in prototype)|(?:Prototype after '.')) for /) {
46 0 0       0 $old_warn ? $old_warn->(@_) : warn @_;
47             }
48 14         63 };
49              
50 14         14 my $unregister;
51             {
52 14         15 my $called = 0;
  14         15  
53             $unregister = sub {
54 30 100   30   3095 return if $called++;
55 14         47 $class->teardown_for([$ret, $unregister]);
56 14         67 $SIG{__WARN__} = $old_warn;
57 14         32 };
58             }
59              
60 14         44 &B::Hooks::EndOfScope::on_scope_end($unregister);
61              
62 14         195 return [$ret, $unregister];
63             }
64              
65             sub teardown_for {
66 16     16 0 19 my ($class, $data) = @_;
67 16         37 delete $^H{"${class}::enabled"};
68 16         59 $class->teardown($data->[0]);
69 16         35 $data->[1]->();
70 16         19 return;
71             }
72              
73             sub callback {
74 18     18 1 25 my ($class, $offset, $proto) = @_;
75 18         34 my $inject = $class->proto_unwrap($proto);
76 18         38 $class->inject($offset, $inject);
77 18         1156 return;
78             }
79              
80             sub proto_unwrap {
81 17     17 1 24 my ($class, $proto) = @_;
82 17 100       43 return '' unless length $proto;
83 16         42 return "my ($proto) = \@_;";
84             }
85              
86             sub inject {
87 18     18 1 20 my ($class, $offset, $inject) = @_;
88 18         38 my $linestr = B::Hooks::Parser::get_linestr();
89 18         36 substr($linestr, $offset + 1, 0) = $inject;
90 18         31 B::Hooks::Parser::set_linestr($linestr);
91 18         20 return;
92             }
93              
94             1;
95              
96             __END__