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   48610 use warnings;
  3         4  
  3         88  
4 3     3   12 use strict;
  3         3  
  3         128  
5              
6             our $VERSION = '0.02';
7              
8 3     3   15 use Carp qw(croak);
  3         8  
  3         212  
9 3     3   1387 use Scope::OnExit::Wrap qw(on_scope_exit);
  3         1561  
  3         169  
10 3     3   1325 use Return::MultiLevel qw(with_return);
  3         9304  
  3         153  
11              
12 3     3   15 use parent 'Exporter::Tiny';
  3         5  
  3         9  
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 700 my ($body, $handlers) = @_;
25 5         6 my $limit = @restarts;
26 5     5   111 my $guard = on_scope_exit { splice @restarts, $limit };
  5         887  
27 5         24 push @restarts, \%$handlers;
28 5         10 $body->()
29             }
30              
31             sub case (&$) {
32 8     8 1 355 my ($body, $handlers) = @_;
33 8         13 my $limit = @restarts;
34 8     8   214 my $guard = on_scope_exit { splice @restarts, $limit };
  8         830  
35 8         47 my $wantlist = wantarray;
36             my @v = with_return {
37 8     8   406 my ($return) = @_;
38 10         13 push @restarts, {
39             map {
40 8         23 my $v = $handlers->{$_};
41 4         14 $_ => sub { $return->($v, @_) }
42 10         40 } keys %$handlers
43             };
44 8 50       21 unless (defined $wantlist) {
45 0         0 $body->();
46 0         0 return;
47             }
48 8 100       25 undef, $wantlist ? $body->() : scalar $body->()
49 8         50 };
50 7 100       3042 if (my $f = shift @v) {
51 4         11 return $f->(@v);
52             }
53 3 100       94 $wantlist ? @v : $v[0]
54             }
55              
56             sub _find {
57 13     13   30 my ($k) = @_;
58 13         26 for my $rs (reverse @restarts) {
59 11         14 my $v = $rs->{$k};
60 11 100       36 return $v if $v;
61             }
62             undef
63 6         35 }
64              
65             sub invoke {
66 6     6 1 953 my $proto = shift;
67 6 100 33     25 my $code = ref $proto ? $proto->code : _find($proto) || croak qq{No restart named "$proto" is active};
68 6         16 $code->(@_)
69             }
70              
71             sub find {
72 8     8 1 19 my ($name) = @_;
73 8 100       16 my $code = _find($name) or return undef;
74 2         458 require Worlogog::Restart::Restart;
75 2         24 Worlogog::Restart::Restart->new(
76             name => $name,
77             code => $code,
78             )
79             }
80              
81             sub compute {
82 5     5 1 14 my @r;
83 5         11 for my $rs (reverse @restarts) {
84 10         855 for my $k (sort keys %$rs) {
85 12         49 my $v = $rs->{$k};
86 12         457 require Worlogog::Restart::Restart;
87 12         213 push @r, Worlogog::Restart::Restart->new(
88             name => $k,
89             code => $v,
90             );
91             }
92             }
93             @r
94 5         138 }
95              
96             'ok'
97              
98             __END__