1 package App::Clifton::Task;
3 use Log::Contextual qw(:log);
7 extends 'App::Clifton::Component';
9 has on_finished => (is => 'rw');
11 has name => (is => 'ro', required => 1);
13 has body => (is => 'ro', required => 1);
15 has guard => (is => 'ro', predicate => 'has_guard');
17 has args => (is => 'ro', required => 1);
19 has dependencies => (is => 'ro', default => sub { {} });
21 has merge_point => (is => 'lazy');
23 sub _build_merge_point { Async::MergePoint->new }
27 if (my $cb = $self->args->{on_finished}) {
28 $self->on_finished($cb);
30 my $deps = $self->dependencies;
31 if (my @needs = keys %$deps) {
32 my $mp = $self->merge_point;
34 foreach my $key (@needs) {
35 $deps->{$key}->on_finished(sub { $mp->done($key => $_[0]) });
37 $mp->close(on_finished => $self->_capture_weakself('_schedule_body'));
39 $self->_schedule_body;
44 my ($self, %args) = @_;
45 my $fire_body = $self->_capture_weakself('_fire_body');
46 $args{on_finished} = $self->_finished_callback;
47 %args = (%{$self->args}, %args);
48 $self->_schedule(sub { $fire_body->(\%args); });
53 if ($self->has_guard and my ($result) = $self->guard->(@_)) {
54 $_[0]->{on_finished}($result);
60 sub _finished_callback {
62 $self->_capture_weakself('_schedule_finished');
65 sub _schedule_finished {
66 my ($self, @args) = @_;
67 if (my $on_finished = $self->on_finished) {
68 $self->_schedule(sub { $on_finished->(@args) });
70 $self->parent->remove_child($self);
72 #warn Devel::FindRef::track $self;