Beam-Emitter
view release on metacpan or search on metacpan
t/emitter.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use Test::Fatal;
use Scalar::Util qw[ refaddr ];
{
package My::Emitter;
use Moo;
with 'Beam::Emitter';
sub foo {
my ( $self ) = @_;
my $event = $self->emit( "foo" );
return if $event->is_default_stopped;
$self->emit( "after_foo" );
}
}
subtest 'event listeners' => sub {
my $emitter = My::Emitter->new;
my $foo_listener = sub {
my ( $event ) = @_;
is $event->name, 'foo', 'foo event has correct name';
is $event->emitter, $emitter, 'foo event has correct emitter';
};
my $after_foo_listener = sub {
my ( $event ) = @_;
is $event->name, 'after_foo', 'after_foo event has correct name';
is $event->emitter, $emitter, 'after_foo event has correct emitter';
};
$emitter->on( foo => $foo_listener );
$emitter->subscribe( after_foo => $after_foo_listener );
$emitter->foo;
};
subtest 'unsubscribe' => sub {
my $emitter = My::Emitter->new;
my $foo_count = 0;
my $foo_listener = sub {
my ( $event ) = @_;
if ( $foo_count++ == 0 ) {
is $event->name, 'foo', 'foo event has correct name';
is $event->emitter, $emitter, 'foo event has correct emitter';
}
else {
fail "foo listener not called a second time";
}
};
my $after_foo_count = 0;
my $after_foo_listener = sub {
my ( $event ) = @_;
if ( $after_foo_count++ == 0 ) {
is $event->name, 'after_foo', 'after_foo event has correct name';
is $event->emitter, $emitter, 'after_foo event has correct emitter';
}
else {
fail "after_foo listener not called a second time";
}
};
$emitter->on( foo => $foo_listener );
$emitter->subscribe( after_foo => $after_foo_listener );
( run in 1.177 second using v1.01-cache-2.11-cpan-54e63673c56 )