#!/usr/bin/perl -w
use strict;
# Use POE!
use POE qw/Wheel::ReadLine/;
# Need to do this on Cygwin
#$/="\n\r";
# flush STDOUT automatically
$|++;
POE::Session->create(
inline_states =>
{ _start => \&handler_start,
gotLine => \&handler_gotLine,
prompt => \&handler_prompt,
timeout => \&handler_timeout,
#_stop => \&handler_stop,
}
);
####
$poe_kernel->run();
exit;
##
##
sub handler_start {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
# POE::Wheel::ReadLine gets you terminal input with command line
# history. whenever a line is input, the 'gotLine' event
# will run
$heap->{wheel} = POE::Wheel::ReadLine->new
(
InputEvent => 'gotLine',
);
# ask for the prompt event to get run next
$kernel->yield('prompt');
}
##
##
sub handler_prompt {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
print "You have 10 seconds to enter something, or I'll quit!$/";
$heap->{wheel}->get('Type fast: ');
# this will make the timeout event fire in 10 seconds
$kernel->delay('timeout',10);
}
##
##
sub handler_timeout {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
# taunt (or inform) the user
print "You took too long, game over$/";
# setting this to undef will make our Wheel get shutdown
# with no wheel, and no pending delay event, the kernel
# queue is empty resulting in shutdown
$heap->{wheel}=undef;
}
##
##
sub handler_gotLine {
my ($kernel, $heap, $session, $arg, $exception) =
@_[KERNEL, HEAP, SESSION, ARG0, ARG1];
if(defined $arg) {
$heap->{wheel}->addhistory($arg);
print "Very good, you entered '$arg'. You get another 10 seconds.$/";
}
else {
print "Got input exception '$exception'. Exiting...$/";
# setting this to undef will make our Wheel get shutdown
$heap->{wheel}=undef;
# setting a delay without a timeout number clears the event
$kernel->delay('timeout');
return;
}
# run the prompt event again to reset timeout and print
# new prompt
$kernel->yield('prompt');
}