The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use POE qw(Component::Client::Telnet);

my $self = POE::Component::Client::Telnet->new(
#	debug => 1,
	telnet_options => [
	], # could put something here, or omit it
);

POE::Session->create(
	inline_states => {
		_start => \&_start,
		callback => \&callback,
		opened => \&opened,
		cont => \&cont,
		city_code => \&city_code,
		enter_city => \&enter_city,
		get_forecast => \&get_forecast,
		forecast => \&forecast,
	},
);

sub _start {
	#$self->open({ event => 'opened' },"rainmaker.wunderground.com");
	# alternative way
	$self->yield(open => { event => 'opened' } => "rainmaker.wunderground.com");
	$self->option_callback({ },"callback");
}

sub callback {
	warn "option callback!\n";
}

sub opened {
	# Wait for first prompt
	# $self->waitfor({ event => 'cont' },'/continue:.*$/');
	# alternative way
	$_[KERNEL]->post($self->session_id() => waitfor => { event => 'cont' } => '/continue:.*$/');
}

sub cont {
	# "hit return".
	$self->print({ event => 'city_code' },"");
}

sub city_code {
	# Wait for second prompt and respond with city code.
	$self->waitfor({ event => 'enter_city' },'/city code.*$/');
}

sub enter_city {
	$self->print({ event => 'get_forecast' },"BRD");
}

sub get_forecast {
	# Read and print the first page of forecast.
	$self->waitfor({ event => 'forecast' },'/[ \t]+press return to continue/i');
}

sub forecast {
	print "weather for BRD: ".$_[ARG0]->{result}."\n";
	#$_[KERNEL]->post($self->session_id => 'shutdown');
	# alternative
	$self->shutdown;
#	$self->DESTROY;
}

$poe_kernel->run();

exit;