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   80425 use warnings;
  3         8  
  3         99  
4 3     3   17 use strict;
  3         6  
  3         207  
5              
6             our $VERSION = '0.01';
7              
8 3         33 use Sub::Exporter -setup => {
9             exports => [
10             qw(
11             case
12             bind
13             invoke
14             find
15             compute
16             )
17             ],
18 3     3   3157 };
  3         54682  
19              
20 3     3   1240 use Carp qw(croak);
  3         9  
  3         169  
21 3     3   3159 use Scope::OnExit::Wrap qw(on_scope_exit);
  3         2838  
  3         206  
22 3     3   3000 use Return::MultiLevel qw(with_return);
  3         14879  
  3         2317  
23              
24             our @restarts;
25              
26             sub bind (&$) {
27 5     5 1 880 my ($body, $handlers) = @_;
28 5         8 my $limit = @restarts;
29 5     5   234 my $guard = on_scope_exit { splice @restarts, $limit };
  5         1262  
30 5         31 push @restarts, \%$handlers;
31 5         15 $body->()
32             }
33              
34             sub case (&$) {
35 8     8 1 553 my ($body, $handlers) = @_;
36 8         19 my $limit = @restarts;
37 8     8   239 my $guard = on_scope_exit { splice @restarts, $limit };
  8         1136  
38 8         56 my $wantlist = wantarray;
39             my @v = with_return {
40 8     8   504 my ($return) = @_;
41 10         17 push @restarts, {
42             map {
43 8         25 my $v = $handlers->{$_};
44 4         15 $_ => sub { $return->($v, @_) }
45 10         55 } keys %$handlers
46             };
47 8 50       27 unless (defined $wantlist) {
48 0         0 $body->();
49 0         0 return;
50             }
51 8 100       29 undef, $wantlist ? $body->() : scalar $body->()
52 8         55 };
53 7 100       4437 if (my $f = shift @v) {
54 4         14 return $f->(@v);
55             }
56 3 100       103 $wantlist ? @v : $v[0]
57             }
58              
59             sub _find {
60 13     13   20 my ($k) = @_;
61 13         61 for my $rs (reverse @restarts) {
62 11         22 my $v = $rs->{$k};
63 11 100       49 return $v if $v;
64             }
65             undef
66 6         105 }
67              
68             sub invoke {
69 6     6 1 1059 my $proto = shift;
70 6 100 33     29 my $code = ref $proto ? $proto->code : _find($proto) || croak qq{No restart named "$proto" is active};
71 6         18 $code->(@_)
72             }
73              
74             sub find {
75 8     8 1 18 my ($name) = @_;
76 8 100       19 my $code = _find($name) or return undef;
77 2         850 require Worlogog::Restart::Restart;
78 2         33 Worlogog::Restart::Restart->new(
79             name => $name,
80             code => $code,
81             )
82             }
83              
84             sub compute {
85 5     5 1 22 my @r;
86 5         12 for my $rs (reverse @restarts) {
87 10         959 for my $k (sort keys %$rs) {
88 12         55 my $v = $rs->{$k};
89 12         792 require Worlogog::Restart::Restart;
90 12         262 push @r, Worlogog::Restart::Restart->new(
91             name => $k,
92             code => $v,
93             );
94             }
95             }
96             @r
97 5         163 }
98              
99             'ok'
100              
101             __END__