X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FApp%2FClifton%2FTask.pm;fp=lib%2FApp%2FClifton%2FTask.pm;h=216e3c3b1b5cc01da96ddc5ac7fb84ef99faa97c;hb=20038dd8dde462b3d79de150c0124c6c0d494358;hp=0000000000000000000000000000000000000000;hpb=4e538e489b11b9bc25f53815cfed0ddcd201c271;p=scpubgit%2FClifton.git diff --git a/lib/App/Clifton/Task.pm b/lib/App/Clifton/Task.pm new file mode 100644 index 0000000..216e3c3 --- /dev/null +++ b/lib/App/Clifton/Task.pm @@ -0,0 +1,63 @@ +package App::Clifton::Task; + +use Log::Contextual qw(:log); +use Async::MergePoint; +use Moo; + +extends 'App::Clifton::Component'; + +has on_finished => (is => 'rw'); + +has name => (is => 'ro', required => 1); + +has body => (is => 'ro', required => 1); + +has dependencies => (is => 'ro', default => sub { {} }); + +has merge_point => (is => 'lazy'); + +sub _build_merge_point { Async::MergePoint->new } + +sub BUILD { + my ($self) = @_; + my $deps = $self->dependencies; + if (my @needs = keys %$deps) { + my $mp = $self->merge_point; + $mp->needs(@needs); + foreach my $key (@needs) { + $deps->{$key}->on_finished(sub { $mp->done($key => $_[0]) }); + } + $mp->close(on_finished => $self->_capture_weakself('_schedule_body')); + } else { + $self->_schedule_body; + } +} + +sub _schedule_body { + my ($self, %args) = @_; + my $fire_body = $self->_capture_weakself('_fire_body'); + $args{on_finished} = $self->_finished_callback; + $self->_schedule(sub { $fire_body->(\%args); }); +} + +sub _fire_body { + my $self = shift; + $self->body->(@_); +} + +sub _finished_callback { + my ($self) = @_; + $self->_capture_weakself('_schedule_finished'); +} + +sub _schedule_finished { + my ($self, @args) = @_; + if (my $on_finished = $self->on_finished) { + $self->_schedule(sub { $on_finished->(@args) }); + } + $self->parent->remove_child($self); +#$self->$::Dwarn; +#warn Devel::FindRef::track $self; +} + +1;