use 5.008003;
use MooseX::Declare;
role Thread::Task::Role::Task {
use MooseX::Types::Moose qw(Int);
require Scalar::Util;
my $SEQUENCE = 0;
my %INDEX = 0;
has task_revision => (
isa => Int,
is => 'ro',
lazy_build => 1,
predicate => '_has_taskrev',
writer => '_set_taskrev',
);
method _build_task_revision() {
my $rev = ++$SEQUENCE;
$INDEX{$rev} = $self;
Scalar::Util::weaken($INDEX{$rev});
return $rev;
}
method task_reset() {
if ($self->_has_taskrev) {
delete $INDEX{$self->task_revision};
}
$self->_set_taskrev(++$SEQUENCE);
return;
}
method task_owner($invocant: Int $task_rev) {
return $INDEX{$task_rev};
}
method task_request(:$task, %params) {
Class::MOP::load_class($task);
$task->isa('Thread::Task')
or die "Bad class $task, not a Thread::Task";
$class->new(owner=>$self,%params)->schedule;
}
method task_response(Task_T $task) {
my $class = $self->meta->name;
my $task_class = $task->meta->name;
die "Unhandled task_response for $class (recieved $task_class)";
}
}
1;