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

sub POE::Kernel::ASSERT_DEFAULT () { 1 }
sub POE::Kernel::CATCH_EXCEPTIONS () { 1 }
sub POE::Session::ASSERT_STATES () { 0 }

use POE;
use POE::Component::IKC::Client;
use POE::Component::IKC::Responder;

POE::Component::IKC::Responder->spawn;

POE::Component::IKC::Client->spawn(
    ip         => '127.0.0.1',
    port       => 12345,
    name       => "Client$$",
    on_connect => \&start_session,
);

sub start_session {

    POE::Session->create(
        inline_states => {

            _start => sub {
                my ($kernel) = $_[KERNEL];
                $kernel->alias_set('IncrementorClient');
                $kernel->yield('start_ikc');
                $kernel->delay( 'kill_everyone', 1 );
            },

            start_ikc => sub {
                my ($kernel) = $_[KERNEL];
                $kernel->post( 'IKC', 'call', 'poe://Server/Incrementor/inc', undef, 'poe:get_result' );
            },

            get_result => sub {
                my ( $kernel, $heap, $arg ) = @_[ KERNEL, HEAP, ARG0 ];
                print "Result: $arg\n";
                unless( $heap->{shutdown} ) {
                    $kernel->post( 'IKC', 'call', 'poe://Server/Incrementor/inc', undef, 'poe:get_result' );
                }
            },

            kill_everyone => sub {
                my ($kernel, $heap) = @_[KERNEL, HEAP];
                $heap->{shutdown} = 1;
                $kernel->post( IKC => 'shutdown' );
            },

            _stop => sub { print "Finished...\n"; exit(0) },
          }
    );

}

POE::Kernel->run();