package Foo; use Moose; use MooseX::JobControl; use MooseX::LogDispatch; use MooseX::JobControl::Engine::POE; use MooseX::Workers::Job::Command; use MooseX::Workers::Job::Code; with Logger( interface => 'levels' ); has controller => ( isa => 'MooseX::JobControl', is => 'ro', default => sub { MooseX::JobControl->new( engine => MooseX::JobControl::Engine::POE->new(), ); }, handles => [qw(job_queue)], ); sub run { my ($self) = @_; $self->debug('starting test'); $self->controller->add_job( new_job($_) ) for ( 'ls -lF /tmp/*', 'ls -lF /Users/perigrin/dev', 'ls -lF /Users/perigrin/dev/Moose', sub { sleep(5); return }, ); $self->controller->run; } sub new_job { my $type = ref $_[0] eq 'CODE' ? 'Code' : 'Command'; "MooseX::Workers::Job::$type"->new( command => shift ); } __PACKAGE__->new->run