use 5.008003; use MooseX::Declare; class Thread::Task::Handle { use TryCatch; use MooseX::Types::Moose qw(ClassName Int ArrayRef); use Thread::Task::Types qw(Handle_T Worker_T Task_T Finished_ET); use Thread::Task::Exception::Finished; use MooseX::MultiMethods; require Scalar::Util; our $SEQUENCE = 0; has hid => ( isa => Int, is => 'ro', default => sub { ++$SEQUENCE }, ); has task => ( isa => Task_T, is => 'ro', required => 1, ); has execption => ( is => 'ro', writer => '_set_exception', predicate => 'has_exception', init_arg => undef, ); multi method BUILDARGS(ClassName $class: Task_T $task) { return $class->next::method({task=>$task}); } method prepare() { try { $self->task->prepare; } catch (Finished_ET $e) { die $e; } catch { die Thread::Task::Exception::Finished->new(msg=>$@); } } method finish() { try { $self->task->finish; } catch (Finished_ET $e) { die $e; } catch { die Thread::Task::Exception::Finished->new(msg=>$@); } } method run() { try { $self->task->handle($self); $self->task->run; $self->task->clear_handle; } catch (Finished_ET $e) { } catch ($e) { $self->task->clear_handle; $self->_set_exception($e); } return; } method as_array() { return [ $self->hid, $self->task->meta->name, $self->task->as_string, ]; } method from_array(ClassName $class: ArrayRef $array) { my ($hid,$task_class,$task_serialized)=@$array; Class::MOP::load_class($task_class); return $class->new( hid=>$hid, task=>$task_class->from_string($task_serialized), ); } method message(@message) { Thread::Task::Manager->instance->conduit->signal( Storable::nfreeze([$self->hid,@message]) ); } method on_message(Str $method, @args) { unless ($self->task->can($method)) { return; } try { $self->task->$method(@args); } catch { return; } return; } method started() { $self->message('__STARTED__'); } method stopped() { $self->message('__STOPPED__',$self->task); } method on_stopped(Task_T $new_task, @args) { $self->task->_update($new_task); try { $self->task->finish(@args); } catch { return; } return; } } 1;