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

use warnings;
use strict;

use lib './blib/lib';
use lib '../blib/lib';

use Test::More tests => 22;
use POE::Kernel;
use POE::Session::MessageBased;

POE::Session::MessageBased->create(
	inline_states => {
		_start => sub {
			my ($message, @params) = @_;
			ok($message->isa("POE::Session::Message"), "inline message is ok");
			$message->kernel->yield( count => 2 );
		},
		count => sub {
			my ($message, $count) = @_;
			pass("inline got count $count");
			if ($count < 10) {
				$message->kernel->yield( count => ++$count );
			}
		},
		_stop => sub {
			pass("inline test stopped");
		}
	},
);

POE::Session::MessageBased->create(
	object_states => [
		main->new() => {
			_start => "_poe_handle_start",
			count  => "_poe_handle_count",
			_stop  => "_poe_handle_stop",
		}
	],
);

POE::Kernel->run();
exit;

sub new { return bless {}, shift }

sub _poe_handle_start {
	my ($self, $message, @params) = @_;
	die unless ref($message->object) eq "main";
	ok($message->isa("POE::Session::Message"), "object message is ok");
	$message->kernel->yield( count => 13 );
}

sub _poe_handle_count {
	my ($self, $message, $count) = @_;
	die unless ref($message->object) eq "main";
	pass("object counter $count");
	if ($count < 21) {
		$message->kernel->yield( count => ++$count );
	}
}

sub _poe_handle_stop {
	pass("object test stopped");
}