package Canella::Task;
use Moo;
use Canella 'CTX';
has code => (
is => 'ro',
required => 1,
);
has name => (
is => 'ro',
required => 1,
);
has description => (
is => 'rw',
);
sub add_guard;
sub execute {
my $self = shift;
CTX->stash(current_task => $self);
my %guards;
no warnings 'redefine';
local *add_guard = sub {
$guards{$_[1]} = $_[2];
};
eval {
$self->code->(@_);
};
my $E = $@;
foreach my $guard (values %guards) {
if (! $guard->should_fire($self)) {
$guard->cancel;
}
}
# Make sure to fire the guard objects here
undef %guards;
die $E if $E;
}
1;