<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package Test2::Workflow::Task;
use strict;
use warnings;

our $VERSION = '0.000162';

use Test2::API();
use Test2::Event::Exception();

use List::Util qw/min max/;
use Scalar::Util qw/blessed/;
use Carp qw/croak/;
our @CARP_NOT = qw/Test2::Util::HashBase/;

use base 'Test2::Workflow::BlockBase';
use Test2::Util::HashBase qw/name flat async iso todo skip scaffold events is_root/;

for my $attr (FLAT, ISO, ASYNC, TODO, SKIP, SCAFFOLD) {
    my $old = __PACKAGE__-&gt;can("set_$attr");
    my $new = sub {
        my $self = shift;
        my $out = $self-&gt;$old(@_);
        $self-&gt;verify_scaffold;
        return $out;
    };

    no strict 'refs';
    no warnings 'redefine';
    *{"set_$attr"} = $new;
}

sub init {
    my $self = shift;

    $self-&gt;{+EVENTS} ||= [];

    {
        local $Carp::CarpLevel = $Carp::CarpLevel + 1;
        $self-&gt;SUPER::init();
    }

    $self-&gt;throw("the 'name' attribute is required")
        unless $self-&gt;{+NAME};

    $self-&gt;throw("the 'flat' attribute cannot be combined with 'iso' or 'async'")
        if $self-&gt;{+FLAT} &amp;&amp; ($self-&gt;{+ISO} || $self-&gt;{+ASYNC});

    $self-&gt;set_subname($self-&gt;package . "::&lt;$self-&gt;{+NAME}&gt;");

    $self-&gt;verify_scaffold;
}

sub clone {
    my $self = shift;
    return bless {%$self}, blessed($self);
}

sub verify_scaffold {
    my $self = shift;

    return unless $self-&gt;{+SCAFFOLD};

    croak "The 'flat' attribute must be true for scaffolding"
        if defined($self-&gt;{+FLAT}) &amp;&amp; !$self-&gt;{+FLAT};

    $self-&gt;{+FLAT} = 1;

    for my $attr (ISO, ASYNC, TODO, SKIP) {
        croak "The '$attr' attribute cannot be used on scaffolding"
            if $self-&gt;{$attr};
    }
}

sub exception {
    my $self = shift;
    my ($err) = @_;

    my $hub = Test2::API::test2_stack-&gt;top;

    my $trace = $self-&gt;trace($hub);

    $hub-&gt;send(
        Test2::Event::Exception-&gt;new(
            trace =&gt; $trace,
            error =&gt; $err,
        ),
    );
}

sub filter {
    my $self = shift;
    my ($filter) = @_;

    return unless $filter;
    return if $self-&gt;{+IS_ROOT};
    return if $self-&gt;{+SCAFFOLD};

    if (my $name = $filter-&gt;{name}) {
        my $ok = 0;
        unless(ref($name)) {
            $ok ||= $self-&gt;{+NAME} eq $name;
            $ok ||= $self-&gt;subname eq $name;
        }
        if (ref($name) eq 'Regexp') {
            $ok ||= $self-&gt;{+NAME} =~ $name;
            $ok ||= $self-&gt;subname =~ $name;
        }
        elsif ($name =~ m{^/}) {
            my $pattern = eval "qr$name" or die "'$name' does not appear to be a valid pattern";
            $ok ||= $self-&gt;{+NAME} =~ $pattern;
            $ok ||= $self-&gt;subname =~ $pattern;
        }

        return {skip =&gt; "Does not match name filter '$name'"}
            unless $ok;
    }

    if (my $file = $filter-&gt;{file}) {
        return {skip =&gt; "Does not match file filter '$file'"}
            unless $self-&gt;file eq $file;
    }

    if (my $line = $filter-&gt;{line}) {
        my $lines = $self-&gt;lines;

        return {skip =&gt; "Does not match line filter '$line' (no lines)"}
            unless $lines &amp;&amp; @$lines;

        my $min = min(@$lines);
        my $max = max(@$lines);

        return {skip =&gt; "Does not match line filter '$min &lt;= $line &lt;= $max'"}
            unless $min &lt;= $line &amp;&amp; $max &gt;= $line;
    }

    return;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Test2::Workflow::Task - Encapsulation of a Task

=head1 SOURCE

The source code repository for Test2-Workflow can be found at
F&lt;https://github.com/Test-More/Test2-Suite/&gt;.

=head1 MAINTAINERS

=over 4

=item Chad Granum E&lt;lt&gt;exodist@cpan.orgE&lt;gt&gt;

=back

=head1 AUTHORS

=over 4

=item Chad Granum E&lt;lt&gt;exodist@cpan.orgE&lt;gt&gt;

=back

=head1 COPYRIGHT

Copyright 2018 Chad Granum E&lt;lt&gt;exodist7@gmail.comE&lt;gt&gt;.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

See F&lt;http://dev.perl.org/licenses/&gt;

=cut

</pre></body></html>