File Coverage

blib/lib/Puncheur/Trigger.pm
Criterion Covered Total %
statement 37 47 78.7
branch 3 8 37.5
condition 1 3 33.3
subroutine 9 10 90.0
pod 0 3 0.0
total 50 71 70.4


line stmt bran cond sub pod time code
1             package Puncheur::Trigger;
2 3     3   14 use strict;
  3         4  
  3         109  
3 3     3   13 use warnings;
  3         5  
  3         79  
4              
5 3     3   10 use parent qw/Exporter/;
  3         3  
  3         14  
6 3     3   123 use Scalar::Util ();
  3         4  
  3         38  
7 3     3   1578 use mro;
  3         1558  
  3         12  
8              
9             our @EXPORT = qw/add_trigger call_trigger get_trigger_code/;
10              
11             sub add_trigger {
12 0     0 0 0 my ($class, %args) = @_;
13              
14 0 0       0 if (ref $class) {
15 0         0 while (my ($hook, $code) = each %args) {
16 0         0 push @{$class->{_trigger}->{$hook}}, $code;
  0         0  
17             }
18             } else {
19 3     3   278 no strict 'refs';
  3         6  
  3         547  
20 0         0 while (my ($hook, $code) = each %args) {
21 0         0 push @{${"${class}::_trigger"}->{$hook}}, $code;
  0         0  
  0         0  
22             }
23             }
24             }
25              
26             sub call_trigger {
27 2     2 0 6 my ($class, $hook, @args) = @_;
28 2         5 my @code = $class->get_trigger_code($hook);
29 2         8 for my $code (@code) {
30 0         0 $code->($class, @args);
31             }
32             }
33              
34             sub get_trigger_code {
35 5     5 0 6 my ($class, $hook) = @_;
36 5         6 my @code;
37 5 50       20 if (Scalar::Util::blessed($class)) {
38 5 50       7 push @code, @{ $class->{_trigger}->{$hook} || [] };
  5         35  
39 5         10 $class = ref $class;
40             }
41 3     3   12 no strict 'refs';
  3         4  
  3         292  
42 5   33     25 my $klass = ref $class || $class;
43 5         5 for (@{mro::get_linear_isa($class)}) {
  5         26  
44 10 50       8 push @code, @{${"${_}::_trigger"}->{$hook} || []};
  10         9  
  10         47  
45             }
46 5         14 return @code;
47             }
48              
49             1;