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   19 use strict;
  3         9  
  3         104  
3 3     3   17 use warnings;
  3         9  
  3         104  
4              
5 3     3   15 use parent qw/Exporter/;
  3         7  
  3         18  
6 3     3   161 use Scalar::Util ();
  3         5  
  3         52  
7 3     3   14177 use mro;
  3         3342  
  3         20  
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   621 no strict 'refs';
  3         8  
  3         1133  
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         6 my @code = $class->get_trigger_code($hook);
29 2         7 for my $code (@code) {
30 0         0 $code->($class, @args);
31             }
32             }
33              
34             sub get_trigger_code {
35 5     5 0 12 my ($class, $hook) = @_;
36 5         11 my @code;
37 5 50       27 if (Scalar::Util::blessed($class)) {
38 5 50       12 push @code, @{ $class->{_trigger}->{$hook} || [] };
  5         48  
39 5         13 $class = ref $class;
40             }
41 3     3   17 no strict 'refs';
  3         13  
  3         849  
42 5   33     21 my $klass = ref $class || $class;
43 5         12 for (@{mro::get_linear_isa($class)}) {
  5         27  
44 10 50       14 push @code, @{${"${_}::_trigger"}->{$hook} || []};
  10         10  
  10         74  
45             }
46 5         22 return @code;
47             }
48              
49             1;