The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 10;

package Common;

our @store;

package Consumer;

use POE;
use POE::Declarative;

use Test::More;

our $acc = 1;
our $active = 1;

on _start => run {
    get(KERNEL)->alias_set('consumer');
    yield 'consume';
};

on consume => run {
    if (@Common::store) {
        is(shift(@Common::store), $acc++);
    }

    yield 'consume' if $active || scalar(@Common::store);
};

on 'shutdown' => run {
    $active = 0;
};

package Producer;

use POE;
use POE::Declarative;

on _start => run {
    for (1 .. 10) {
        yield produce => $_;
    }
};

on produce => run {
    push @Common::store, get ARG0;
}; 

on _stop => run {
    call consumer => 'shutdown';
};

package main;

POE::Declarative->setup('Consumer');
POE::Declarative->setup('Producer');
POE::Kernel->run;