our
$VERSION
=
'1.302210'
;
our
@BUILD_FIELDS
;
BEGIN {
@BUILD_FIELDS
=
qw{
primary variant
setup teardown
variant_setup variant_teardown
primary_setup primary_teardown
stash
}
;
}
sub
init {
my
$self
=
shift
;
{
local
$Carp::CarpLevel
=
$Carp::CarpLevel
+ 1;
$self
->SUPER::init();
}
$self
->{
$_
} ||= []
for
@BUILD_FIELDS
;
$self
->{+DEFAULTS} ||= {};
}
for
my
$field
(
@BUILD_FIELDS
) {
my
$code
=
sub
{
my
$self
=
shift
;
push
@{
$self
->{
$field
}} =>
@_
;
};
no
strict
'refs'
;
*{
"add_$field"
} =
$code
;
}
sub
populated {
my
$self
=
shift
;
for
my
$field
(
@BUILD_FIELDS
) {
return
1
if
@{
$self
->{
$field
}};
}
return
0;
}
sub
compile {
my
$self
=
shift
;
warn
"Workflow build '$self->{+NAME}' is empty "
.
$self
->debug .
"\n"
unless
$self
->populated ||
$self
->{+SKIP};
my
(
$primary_setup
,
$primary_teardown
) =
@_
;
$primary_setup
||= [];
$primary_teardown
||= [];
my
$variant
=
$self
->{+VARIANT};
my
$setup
=
$self
->{+SETUP};
my
$teardown
=
$self
->{+TEARDOWN};
my
$variant_setup
=
$self
->{+VARIANT_SETUP};
my
$variant_teardown
=
$self
->{+VARIANT_TEARDOWN};
$primary_setup
= [
@$primary_setup
, @{
$self
->{+PRIMARY_SETUP}}];
$primary_teardown
= [@{
$self
->{+PRIMARY_TEARDOWN}},
@$primary_teardown
];
my
$primary
= [
map
{
$_
->isa(__PACKAGE__)
?
$_
->compile(
$primary_setup
,
$primary_teardown
)
:
$_
;
} @{
$self
->{+PRIMARY}},
];
if
(
@$primary_setup
||
@$primary_teardown
) {
$primary
= [
map
{
my
$p
=
$_
->clone;
$_
->isa(
'Test2::Workflow::Task::Action'
) ? Test2::Workflow::Task::Group->new(
before
=>
$primary_setup
,
primary
=> [
$p
],
take
=>
$p
,
after
=>
$primary_teardown
,
) :
$_
;
}
@$primary
];
}
if
(
@$variant
) {
$primary
= [
map
{
my
$v
=
$_
->clone;
Test2::Workflow::Task::Group->new(
before
=>
$variant_setup
,
primary
=>
$primary
,
after
=>
$variant_teardown
,
variant
=>
$v
,
take
=>
$v
,
);
}
@$variant
];
}
my
%params
=
map
{ Test2::Workflow::Task::Group->can(
$_
) ? (
$_
=>
$self
->{
$_
}) : () }
keys
%$self
;
delete
$params
{
$_
}
for
@BUILD_FIELDS
;
return
Test2::Workflow::Task::Group->new(
%params
,
before
=>
$setup
,
after
=>
$teardown
,
primary
=>
$primary
,
);
}
1;