File Coverage

blib/lib/Evo/Ee.pm
Criterion Covered Total %
statement 62 65 95.3
branch 18 32 56.2
condition n/a
subroutine 10 11 90.9
pod 7 7 100.0
total 97 115 84.3


line stmt bran cond sub pod time code
1             package Evo::Ee;
2 1     1   445 use Evo -Class, 'Carp croak; List::Util first';
  1         2  
  1         7  
3              
4             requires 'ee_events';
5              
6             # [name, cb]
7             has ee_data => sub { {q => [], cur => undef} };
8              
9 12 50   12 1 29 sub ee_check ($self, $name) {
  12 50       22  
  12         17  
  12         16  
  12         17  
10 12 100   17   45 croak qq{Not recognized event "$name"} unless first { $_ eq $name } $self->ee_events;
  17         357  
11 9         35 $self;
12             }
13              
14 6 50   6 1 30 sub on ($self, $name, $fn) {
  6 50       14  
  6         10  
  6         8  
  6         11  
  6         7  
15 6         12 push $self->ee_check($name)->ee_data->{q}->@*, [$name, $fn];
16 5         25 $self;
17             }
18              
19 4 50   4 1 20 sub ee_add ($self, $name, $fn) {
  4 50       9  
  4         6  
  4         7  
  4         4  
  4         6  
20 4         9 push $self->ee_check($name)->ee_data->{q}->@*, my $id = [$name, $fn];
21 3         7 $id;
22             }
23              
24 1 50   1 1 7 sub ee_remove ($self, $id) {
  1 50       4  
  1         1  
  1         2  
  1         2  
25 1         3 my $data = $self->ee_data->{q};
26 1 50   0   77 defined(my $index = first { $data->[$_] == $id } 0 .. $#$data) or croak "$id isn't a listener";
  0         0  
27 0         0 splice $data->@*, $index, 1;
28 0         0 $self;
29             }
30              
31 2 50   2 1 20 sub ee_remove_current($self) {
  2 50       5  
  2         6  
  2         3  
32 2         4 my ($q, $cur) = @{$self->ee_data}{qw(q cur)};
  2         10  
33 2 100   1   125 defined(my $index = first { $q->[$_] == $cur } 0 .. $#$q) or croak "Not in the event";
  1         4  
34 1         5 splice $q->@*, $index, 1;
35 1         6 $self;
36             }
37              
38              
39 3 50   3 1 17 sub emit ($self, $name, @args) {
  3         6  
  3         5  
  3         7  
  3         5  
40 3         6 my $data = $self->ee_data;
41 2         5 do { local $data->{cur} = $_; $_->[1]->($self, @args) }
  2         6  
42 3         10 for grep { $_->[0] eq $name } $self->ee_data->{q}->@*;
  2         7  
43 3         10 $self;
44             }
45              
46 2 50   2 1 845 sub ee_listeners ($self, $name) {
  2 50       6  
  2         4  
  2         4  
  2         3  
47 2         6 grep { $_->[0] eq $name } $self->ee_data->{q}->@*;
  6         18  
48             }
49              
50             1;
51              
52             __END__