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 )