File Coverage

blib/lib/Mojolicious/Plugin/Util/Callback.pm
Criterion Covered Total %
statement 30 30 100.0
branch 14 16 87.5
condition 21 29 72.4
subroutine 3 3 100.0
pod 1 1 100.0
total 69 79 87.3


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::Util::Callback;
2 3     3   2510 use Mojo::Base 'Mojolicious::Plugin';
  3         6  
  3         47  
3              
4             our $VERSION = '0.07';
5              
6             my %callback;
7              
8             # Register the plugin
9             sub register {
10 3     3 1 125 my ($plugin, $mojo) = @_;
11              
12             # Add 'callback' helper
13             $mojo->helper(
14             callback => sub {
15 32     32   47127 my $c = shift;
16 32         65 my $name = shift;
17              
18             # Establish callbacks by array reference
19 32 100 66     190 if (ref $name && ref $name eq 'ARRAY') {
    100 66        
20              
21             # Param hash reference
22 3         4 my $param = shift;
23              
24             # -once flag
25 3         5 my $flag = shift;
26              
27             # For each given callback name
28 3         5 foreach (@$name) {
29              
30             # Get callback
31 4         8 my $cb = delete $param->{$_};
32              
33             # Get callback
34 4 100 33     13 if ($cb) {
    50          
35              
36             # Establish callback
37 3 50 33     14 if (ref $cb && ref $cb eq 'CODE') {
38 3         12 $c->app->callback($_, $cb, $flag);
39             };
40             }
41              
42             elsif ($flag && $flag eq '-once') {
43              
44             # Only allow the next establishement
45 1         3 $callback{$_} = [undef, 1];
46             };
47             };
48              
49             # Everything went fine
50 3         8 return 1;
51             }
52              
53             # Establish callback
54             elsif (ref $_[0] && ref $_[0] eq 'CODE') {
55 11         19 my $cb = shift;
56 11 100 66     31 my $once = $_[0] && $_[0] eq '-once' ? 1 : 0;
57              
58             # Callback exists
59 11 100 100     56 if (exists $callback{$name} && # Callback exists
      100        
60             $callback{$name}->[0] && # Callback is defined
61             $callback{$name}->[1]) { # Callback is -once
62 2         9 $c->app->log->debug(
63             qq{No allowance to redefine callback "$name"}
64             );
65              
66             # Return nothing
67 2         396 return;
68             };
69              
70             # Establish callback
71 9   100     34 for ($callback{$name} //= []) {
72 9         29 $_->[0] = $cb;
73 9   100     29 $_->[1] ||= $once;
74             };
75              
76 9         37 return 1;
77             }
78              
79             # Release callback
80             else {
81              
82             # Release existing callback
83 18         32 my $cb;
84 18 100 66     94 if (exists $callback{$name} && ($cb = $callback{$name}->[0])) {
85 17         47 return $cb->($c, @_) ;
86             };
87              
88             # Return nothing
89 1         5 return;
90             };
91             }
92 3         41 );
93             };
94              
95              
96             1;
97              
98              
99             __END__