File Coverage

blib/lib/App/Environ.pm
Criterion Covered Total %
statement 64 64 100.0
branch 21 24 87.5
condition n/a
subroutine 8 8 100.0
pod 2 2 100.0
total 95 98 96.9


line stmt bran cond sub pod time code
1             package App::Environ;
2              
3 3     3   48547 use 5.008000;
  3         8  
4 3     3   10 use strict;
  3         4  
  3         67  
5 3     3   10 use warnings;
  3         7  
  3         110  
6              
7             our $VERSION = '0.22';
8              
9 3     3   9 use Carp qw( croak );
  3         3  
  3         1226  
10              
11             my %REGD_HANDLERS;
12             my %MODULES_IDX;
13              
14              
15             sub register {
16 6     6 1 96 my $class = shift;
17 6         9 my $module_class = shift;
18 6         26 my %handlers = @_;
19              
20 6 100       17 unless ( defined $module_class ) {
21 1         142 croak 'Module class must be specified';
22             }
23              
24 5 50       12 unless ( exists $MODULES_IDX{$module_class} ) {
25 5         8 $MODULES_IDX{$module_class} = {};
26             }
27 5         7 my $events_idx = $MODULES_IDX{$module_class};
28              
29 5         22 while ( my ( $event_name, $handler ) = each %handlers ) {
30 17 50       26 next if exists $events_idx->{$event_name};
31              
32 17         15 $events_idx->{$event_name} = 1;
33 17 100       24 unless ( exists $REGD_HANDLERS{$event_name} ) {
34 10         14 $REGD_HANDLERS{$event_name} = [];
35             }
36 17 100       40 if ( $event_name =~ m/\:r$/ ) {
37 7         8 unshift( @{ $REGD_HANDLERS{$event_name} }, $handler );
  7         22  
38             }
39             else {
40 10         9 push( @{ $REGD_HANDLERS{$event_name} }, $handler );
  10         25  
41             }
42             }
43              
44 5         12 return;
45             }
46              
47             sub send_event {
48 8     8 1 3339 my $class = shift;
49 8         29 my $event_name = shift;
50 8 100       23 my $cb = pop if ref( $_[-1] ) eq 'CODE';
51 8         14 my @args = @_;
52              
53 8 100       15 unless ( defined $event_name ) {
54 1         122 croak 'Event name must be specified';
55             }
56              
57 7 100       16 unless ( exists $REGD_HANDLERS{$event_name} ) {
58 1 50       3 $cb->() if defined $cb;
59 1         2 return;
60             }
61              
62 6         4 my @handlers = @{ $REGD_HANDLERS{$event_name} };
  6         15  
63 6 100       9 if ( defined $cb ) {
64 2         5 $class->_process_async( \@handlers, \@args, $cb );
65             }
66             else {
67 4         7 foreach my $handler (@handlers) {
68 11         45 $handler->(@args);
69             }
70             }
71              
72 5         14 return;
73             }
74              
75             sub _process_async {
76 4     4   2 my $class = shift;
77 4         4 my $handlers = shift;
78 4         4 my $args = shift;
79 4         2 my $cb = shift;
80              
81 4         3 my $handler = shift @{$handlers};
  4         5  
82              
83 4         44 $handler->( @{$args},
84             sub {
85 4     4   22 my $err = shift;
86              
87 4 100       8 if ( defined $err ) {
88 1         2 $cb->($err);
89 1         2 return;
90             }
91              
92 3 100       2 if ( @{$handlers} ) {
  3         6  
93 2         6 $class->_process_async( $handlers, $args, $cb );
94 2         2 return;
95             }
96              
97 1         2 $cb->();
98             }
99 4         3 );
100              
101 4         16 return;
102             }
103              
104             1;
105             __END__