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