1*5486feefSafresh1package Test2::Workflow::BlockBase; 2*5486feefSafresh1use strict; 3*5486feefSafresh1use warnings; 4*5486feefSafresh1 5*5486feefSafresh1our $VERSION = '0.000162'; 6*5486feefSafresh1 7*5486feefSafresh1use Test2::Util::HashBase qw/code frame _info _lines/; 8*5486feefSafresh1use Test2::Util::Sub qw/sub_info/; 9*5486feefSafresh1use List::Util qw/min max/; 10*5486feefSafresh1use Carp qw/croak/; 11*5486feefSafresh1 12*5486feefSafresh1use Test2::Util::Trace(); 13*5486feefSafresh1 14*5486feefSafresh1BEGIN { 15*5486feefSafresh1 local ($@, $!, $SIG{__DIE__}); 16*5486feefSafresh1 17*5486feefSafresh1 my $set_name = eval { require Sub::Util; Sub::Util->can('set_subname') } 18*5486feefSafresh1 || eval { require Sub::Name; Sub::Name->can('subname') }; 19*5486feefSafresh1 20*5486feefSafresh1 *set_subname = $set_name ? sub { 21*5486feefSafresh1 my $self = shift; 22*5486feefSafresh1 my ($name) = @_; 23*5486feefSafresh1 24*5486feefSafresh1 $set_name->($name, $self->{+CODE}); 25*5486feefSafresh1 delete $self->{+_INFO}; 26*5486feefSafresh1 27*5486feefSafresh1 return 1; 28*5486feefSafresh1 } : sub { return 0 }; 29*5486feefSafresh1} 30*5486feefSafresh1 31*5486feefSafresh1sub init { 32*5486feefSafresh1 my $self = shift; 33*5486feefSafresh1 34*5486feefSafresh1 croak "The 'code' attribute is required" 35*5486feefSafresh1 unless $self->{+CODE}; 36*5486feefSafresh1 37*5486feefSafresh1 croak "The 'frame' attribute is required" 38*5486feefSafresh1 unless $self->{+FRAME}; 39*5486feefSafresh1 40*5486feefSafresh1 $self->{+_LINES} = delete $self->{lines} 41*5486feefSafresh1 if $self->{lines}; 42*5486feefSafresh1} 43*5486feefSafresh1 44*5486feefSafresh1sub file { shift->info->{file} } 45*5486feefSafresh1sub lines { shift->info->{lines} } 46*5486feefSafresh1sub package { shift->info->{package} } 47*5486feefSafresh1sub subname { shift->info->{name} } 48*5486feefSafresh1 49*5486feefSafresh1sub info { 50*5486feefSafresh1 my $self = shift; 51*5486feefSafresh1 52*5486feefSafresh1 unless ($self->{+_INFO}) { 53*5486feefSafresh1 my $info = sub_info($self->code); 54*5486feefSafresh1 55*5486feefSafresh1 my $frame = $self->frame; 56*5486feefSafresh1 my $file = $info->{file}; 57*5486feefSafresh1 my $all_lines = $info->{all_lines}; 58*5486feefSafresh1 my $pre_lines = $self->{+_LINES}; 59*5486feefSafresh1 my $lines = $info->{lines} ||= []; 60*5486feefSafresh1 61*5486feefSafresh1 if ($pre_lines && @$pre_lines) { 62*5486feefSafresh1 @$lines = @$pre_lines; 63*5486feefSafresh1 } 64*5486feefSafresh1 else { 65*5486feefSafresh1 @$lines = ( 66*5486feefSafresh1 min(@$all_lines, $frame->[2]), 67*5486feefSafresh1 max(@$all_lines, $frame->[2]), 68*5486feefSafresh1 ) if $frame->[1] eq $file; 69*5486feefSafresh1 } 70*5486feefSafresh1 71*5486feefSafresh1 # Adjust for start 72*5486feefSafresh1 $lines->[0]-- if $lines->[0] != $lines->[1]; 73*5486feefSafresh1 74*5486feefSafresh1 $self->{+_INFO} = $info; 75*5486feefSafresh1 } 76*5486feefSafresh1 77*5486feefSafresh1 return $self->{+_INFO}; 78*5486feefSafresh1} 79*5486feefSafresh1 80*5486feefSafresh1sub trace { 81*5486feefSafresh1 my $self = shift; 82*5486feefSafresh1 83*5486feefSafresh1 my ($hub, %params) = @_; 84*5486feefSafresh1 85*5486feefSafresh1 croak "'hub' is required" 86*5486feefSafresh1 unless $hub; 87*5486feefSafresh1 88*5486feefSafresh1 return Test2::Util::Trace->new( 89*5486feefSafresh1 frame => $self->frame, 90*5486feefSafresh1 detail => $self->debug, 91*5486feefSafresh1 92*5486feefSafresh1 buffered => $hub->buffered, 93*5486feefSafresh1 nested => $hub->nested, 94*5486feefSafresh1 hid => $hub->hid, 95*5486feefSafresh1 huuid => $hub->uuid, 96*5486feefSafresh1 97*5486feefSafresh1 %params, 98*5486feefSafresh1 ); 99*5486feefSafresh1} 100*5486feefSafresh1 101*5486feefSafresh1sub debug { 102*5486feefSafresh1 my $self = shift; 103*5486feefSafresh1 my $file = $self->file; 104*5486feefSafresh1 my $lines = $self->lines; 105*5486feefSafresh1 106*5486feefSafresh1 my $line_str = @$lines == 1 ? "around line $lines->[0]" : "around lines $lines->[0] -> $lines->[1]"; 107*5486feefSafresh1 return "at $file $line_str."; 108*5486feefSafresh1} 109*5486feefSafresh1 110*5486feefSafresh1sub throw { 111*5486feefSafresh1 my $self = shift; 112*5486feefSafresh1 my ($msg) = @_; 113*5486feefSafresh1 die "$msg " . $self->debug . "\n"; 114*5486feefSafresh1} 115*5486feefSafresh1 116*5486feefSafresh11; 117*5486feefSafresh1 118*5486feefSafresh1__END__ 119*5486feefSafresh1 120*5486feefSafresh1=pod 121*5486feefSafresh1 122*5486feefSafresh1=encoding UTF-8 123*5486feefSafresh1 124*5486feefSafresh1=head1 NAME 125*5486feefSafresh1 126*5486feefSafresh1Test2::Workflow::BlockBase - Base class for all workflow blocks. 127*5486feefSafresh1 128*5486feefSafresh1=head1 SOURCE 129*5486feefSafresh1 130*5486feefSafresh1The source code repository for Test2-Workflow can be found at 131*5486feefSafresh1F<https://github.com/Test-More/Test2-Suite/>. 132*5486feefSafresh1 133*5486feefSafresh1=head1 MAINTAINERS 134*5486feefSafresh1 135*5486feefSafresh1=over 4 136*5486feefSafresh1 137*5486feefSafresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt> 138*5486feefSafresh1 139*5486feefSafresh1=back 140*5486feefSafresh1 141*5486feefSafresh1=head1 AUTHORS 142*5486feefSafresh1 143*5486feefSafresh1=over 4 144*5486feefSafresh1 145*5486feefSafresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt> 146*5486feefSafresh1 147*5486feefSafresh1=back 148*5486feefSafresh1 149*5486feefSafresh1=head1 COPYRIGHT 150*5486feefSafresh1 151*5486feefSafresh1Copyright 2018 Chad Granum E<lt>exodist7@gmail.comE<gt>. 152*5486feefSafresh1 153*5486feefSafresh1This program is free software; you can redistribute it and/or 154*5486feefSafresh1modify it under the same terms as Perl itself. 155*5486feefSafresh1 156*5486feefSafresh1See F<http://dev.perl.org/licenses/> 157*5486feefSafresh1 158*5486feefSafresh1=cut 159*5486feefSafresh1 160