File Coverage

blib/lib/Worlogog/Restart.pm
Criterion Covered Total %
statement 59 61 96.7
branch 13 14 92.8
condition 1 3 33.3
subroutine 15 15 100.0
pod 5 5 100.0
total 93 98 94.9


line stmt bran cond sub pod time code
1             package Worlogog::Restart;
2              
3 3     3   60857 use warnings;
  3         7  
  3         106  
4 3     3   14 use strict;
  3         4  
  3         156  
5              
6             our $VERSION = '0.03';
7              
8 3     3   15 use Carp qw(croak);
  3         8  
  3         232  
9 3     3   1646 use Scope::OnExit::Wrap qw(on_scope_exit);
  3         4291  
  3         214  
10 3     3   1748 use Return::MultiLevel qw(with_return);
  3         11320  
  3         224  
11              
12 3     3   24 use parent 'Exporter::Tiny';
  3         4  
  3         15  
13             our @EXPORT_OK = qw(
14             case
15             bind
16             invoke
17             find
18             compute
19             );
20              
21             our @restarts;
22              
23             sub bind (&$) {
24 5     5 1 820 my ($body, $handlers) = @_;
25 5         8 my $limit = @restarts;
26 5     5   18 my $guard = on_scope_exit { splice @restarts, $limit };
  5         1144  
27 5         8 push @restarts, \%$handlers;
28 5         10 $body->()
29             }
30              
31             sub case (&$) {
32 8     8 1 470 my ($body, $handlers) = @_;
33 8         12 my $limit = @restarts;
34 8     8   33 my $guard = on_scope_exit { splice @restarts, $limit };
  8         814  
35 8         14 my $wantlist = wantarray;
36             my @v = with_return {
37 8     8   472 my ($return) = @_;
38 10         15 push @restarts, {
39             map {
40 8         24 my $v = $handlers->{$_};
41 4         12 $_ => sub { $return->($v, @_) }
42 10         37 } keys %$handlers
43             };
44 8 50       23 unless (defined $wantlist) {
45 0         0 $body->();
46 0         0 return;
47             }
48 8 100       25 undef, $wantlist ? $body->() : scalar $body->()
49 8         47 };
50 7 100       1215 if (my $f = shift @v) {
51 4         11 return $f->(@v);
52             }
53 3 100       13 $wantlist ? @v : $v[0]
54             }
55              
56             sub _find {
57 13     13   14 my ($k) = @_;
58 13         23 for my $rs (reverse @restarts) {
59 11         12 my $v = $rs->{$k};
60 11 100       39 return $v if $v;
61             }
62             undef
63 6         32 }
64              
65             sub invoke {
66 6     6 1 11 my $proto = shift;
67 6 100 33     22 my $code = ref $proto ? $proto->code : _find($proto) || croak qq{No restart named "$proto" is active};
68 6         32 $code->(@_)
69             }
70              
71             sub find {
72 8     8 1 18 my ($name) = @_;
73 8 100       14 my $code = _find($name) or return undef;
74 2         547 require Worlogog::Restart::Restart;
75 2         8 Worlogog::Restart::Restart->new(
76             name => $name,
77             code => $code,
78             )
79             }
80              
81             sub compute {
82 5     5 1 17 my @r;
83 5         9 for my $rs (reverse @restarts) {
84 10         31 for my $k (sort keys %$rs) {
85 12         15 my $v = $rs->{$k};
86 12         550 require Worlogog::Restart::Restart;
87 12         33 push @r, Worlogog::Restart::Restart->new(
88             name => $k,
89             code => $v,
90             );
91             }
92             }
93             @r
94 5         22 }
95              
96             'ok'
97              
98             __END__