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;