summaryrefslogtreecommitdiff
path: root/lib/Thread/Task/Role/Task.pm
blob: 61f9cbe0231a518df00144e95e348cc8dd2c44b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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;