#!/usr/bin/env perl $|++; package LooseCannon::Cannon; use Moose; use Moose::Util::TypeConstraints; has id => ( is => 'ro', isa => 'Int', required => 1 ); has delay => ( is => 'ro', isa => 'Int', lazy => 1, default => sub { 5 + int( rand(5) ); } ); has fired => ( is => 'rw', isa => 'Bool', lazy => 1, default => 0 ); sub tag { return 'Cannon(' . $_[0]->id . ')'; } sub load { print $_[0]->tag . " is loading, will take ", $_[0]->delay, " seconds\n"; sleep( $_[0]->delay ); $_[0]->fired(1); } sub fire { return $_[0]->can('commence_firing'); } sub commence_firing { $_[0]->load; print $_[0]->tag . " goes KA-BOOM!\n"; } no Moose; 1; package LooseCannon::Gunner; use Moose; use Moose::Util::TypeConstraints; with 'MooseX::Workers'; has 'guns' => ( is => 'ro', isa => 'HashRef', lazy => 1, default => sub { {} } ); sub worker_started { # print "Gunner instructed to fire: ",join(',',@_),"\n"; print "Worker-Started: ", $_[0]->Engine->get_worker( $_[1] ), "\n"; } sub worker_done { print "Gunner done firing: ", join( ',', @_ ), "\n"; print "Worker-Done: ", $_[0]->Engine->get_worker( $_[1] ), "\n"; } sub max_workers_reached { print "Max workers reached: ", join( ',', @_ ), "\n"; } sub worker_stdout { print "Got @_", "\n" } sub execute { my $cannon = new LooseCannon::Cannon( { id => $_[1] } ); print "Finished building ", $cannon->tag, "\n"; use Data::Dumper; my $r = $_[0]->spawn( $cannon->fire, $cannon ); warn "SPAWN: ", Dumper($r), "\n"; } no Moose; 1; package LooseCannon; use MooseX::POE; has count => ( is => 'rw', isa => 'Int', lazy => 1, default => 0 ); has gunner => ( is => 'ro', isa => 'LooseCannon::Gunner', lazy => 1, default => sub { return new LooseCannon::Gunner; } ); has tell_freq => ( is => 'rw', isa => 'Int', default => 3 ); sub ts { return scalar(localtime); } sub kernel { return 'POE::Kernel'; } sub add_count { $_[0]->count( $_[0]->count + 1 ); } sub would_tell { ( int( rand( $_[0]->tell_freq ) ) + 1 ) % $_[0]->tell_freq == 0; } event tell_gunner => sub { print "Telling gunner ", $_[0]->ts, "\n"; $_[0]->gunner->execute( $_[0]->count ); }; event tick => sub { print "Tick(", $_[0]->add_count, ") ", $_[0]->ts, "\n"; $_[0]->kernel->alarm_add( 'tock' => time() + 1 ); $_[0]->yield('tell_gunner') if $_[0]->would_tell; }; event tock => sub { print "Tock(", $_[0]->add_count, ") ", $_[0]->ts, "\n"; $_[0]->kernel->alarm_add( 'tick' => time() + 1 ); $_[0]->yield('tell_gunner') if $_[0]->would_tell; }; sub START { $_[0]->yield('tick'); } sub run { run POE::Kernel; } no MooseX::POE; __PACKAGE__->new->run;