File Coverage

blib/lib/PerlX/Generator/Invocation.pm
Criterion Covered Total %
statement 39 44 88.6
branch 6 10 60.0
condition 0 3 0.0
subroutine 10 11 90.9
pod 0 2 0.0
total 55 70 78.5


line stmt bran cond sub pod time code
1             package PerlX::Generator::Invocation;
2              
3 1     1   6 use strictures 2;
  1         8  
  1         49  
4 1     1   217 use Carp 'croak';
  1         2  
  1         56  
5 1     1   5 use Moo;
  1         2  
  1         6  
6              
7             has _resume_with => (is => 'rw');
8              
9             has code => (is => 'ro', required => 1);
10             has lexical_context => (is => 'ro', required => 1);
11             has start_args => (is => 'ro', required => 1);
12             has done => (is => 'rwp');
13             has return_value => (is => 'rwp');
14              
15             sub next {
16 7     7 0 2160 my ($self, $value) = @_;
17              
18 7 50       21 return undef if $self->done;
19              
20 7         11 local our $Current = $self;
21 7         9 local our $Sent_Value = $value;
22 7         10 local our $Yielded_Value;
23              
24             # should set done here on exception
25 7 100       20 $self->_set_return_value([ $self->code->($self->_resume_with ? () : @{$self->start_args}) ]);
  1         6  
26              
27 1         8 $self->_resume_with(undef);
28 1         3 $self->_set_done(1);
29 1         2 return undef;
30              
31 6         13 __GEN_YIELD:
32             return $Yielded_Value;
33             }
34              
35             sub error {
36 0     0 0 0 my ($self, $error) = @_;
37              
38 0 0 0     0 die "Whut" if $self->done or not $self->_resume_with;
39 0         0 local our $Sent_Error = $error;
40 0         0 $self->next;
41             }
42              
43             sub _gen_suspend {
44 6     6   12 my ($self, $label, $yielded) = @_;
45 6         9 our $Yielded_Value = $yielded;
46 6         18 $self->_resume_with({
47             label => $label,
48             pad_values => $self->lexical_context->get_pad_values,
49             });
50 1     1   605 no warnings 'exiting'; goto __GEN_YIELD;
  1         3  
  1         80  
  6         41  
51             }
52              
53             sub _gen_resume {
54 7     7   12 my ($self) = @_;
55 7 100       14 return unless my $state = $self->_resume_with;
56 6         21 $self->lexical_context->set_pad_values($state->{pad_values});
57 1     1   5 no warnings 'exiting'; no warnings 'deprecated'; goto $state->{label};
  1     1   1  
  1         21  
  1         13  
  1         4  
  1         79  
  6         27  
58             }
59              
60             sub _gen_sent {
61 6 50   6   14 if (our $Sent_Error) { croak $Sent_Error }
  0         0  
62 6         13 our $Sent_Value
63             }
64              
65             1;