Acme-POE-Knee
view release on metacpan or search on metacpan
lib/Acme/POE/Knee.pm view on Meta::CPAN
package Acme::POE::Knee;
BEGIN {
$Acme::POE::Knee::VERSION = '1.12';
}
#ABSTRACT: Time sliced pony race using the POE kernel.
use strict;
use POE;
sub new {
my $class = shift;
my %args = @_;
my $self = { };
my $data = {
dist => 10,
ponies => {
'dngor' => 5,
'Abigail' => 5.2,
'Co-Kane' => 5.4,
'MJD' => 5.6,
'acme' => 5.8,
},
};
### check for wrong input ###
for my $key ( keys %args ) {
unless( exists $data->{$key} ) {
print "WARNING! Option $key is not supported in $class!\n";
}
}
### bless the object into the class ###
bless $self, $class;
### now we start adding the data ###
for my $key (keys %$data) {
if ( exists $args{$key} ) {
$self->{$key} = $args{$key};
} else {
$self->{$key} = $data->{$key};
}
}
### fetch the data ###
sub dist { my $self = shift; $self->{dist} }
sub ponies { my $self = shift; $self->{ponies} }
return $self;
}
sub _start {
my ($kernel, $heap, $name, $delay, $dist) = @_[KERNEL, HEAP, ARG0, ARG1, ARG2];
$heap->{name} = $name;
$heap->{delay} = $delay;
$heap->{dist} = $dist;
printf "Starting pony %10s\n", $heap->{name};
$kernel->delay_add( run => rand($heap->{delay}) );
}
sub run {
my ($kernel, $heap) = @_[KERNEL, HEAP];
printf "Pony %10s has reached stage %3i\n", $heap->{name}, ++$heap->{stage};
die "$heap->{name} won the race!\n" if $heap->{stage} > $heap->{dist};
$kernel->delay_add( run => rand($heap->{delay}) );
}
sub race {
my $self = shift;
for my $name (@{[keys %{$self->ponies()}]} ) {
POE::Session->create (
inline_states => {
_start => \&_start,
run => \&run,
},
args => [ $name, $self->ponies()->{$name}, $self->dist() ],
);
}
$poe_kernel->run();
}
q[POE::Knee!];
__END__
=pod
=head1 NAME
( run in 1.184 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )