Skip to content

Commit

Permalink
allow $class and $extends in event listeners
Browse files Browse the repository at this point in the history
Event listeners are now almost exactly like any other dependency, except
for the "$method" attribute. In order to use "$method" as it is
intended, we'll need to introduce something else. Perhaps "$sub" or
"$constructor".
  • Loading branch information
preaction committed Mar 2, 2015
1 parent ec07812 commit f1e424b
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 3 deletions.
5 changes: 2 additions & 3 deletions lib/Beam/Wire.pm
Original file line number Diff line number Diff line change
Expand Up @@ -782,11 +782,10 @@ sub create_service {

for my $listener ( @listeners ) {
my ( $event, $conf ) = @$listener;
# XXX: Make $class and $extends work here
# XXX: Make $args prepend arguments to the listener
# XXX: Make $args also resolve refs
my $method = $conf->{ $meta{method} };
my $listen_svc = $self->get( $conf->{ $meta{ref} } );
my $method = delete $conf->{ $meta{method} };
my ( $listen_svc ) = $self->find_refs( $conf );
$service->on( $event => sub { $listen_svc->$method( @_ ) } );
}
}
Expand Down
55 changes: 55 additions & 0 deletions t/14_on_event.t
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use Test::More;
use Test::Exception;
use Test::Lib;
use Beam::Wire;
use My::Listener;

subtest 'single event listener' => sub {
my $wire = Beam::Wire->new(
Expand Down Expand Up @@ -109,4 +110,58 @@ subtest 'multiple event listeners' => sub {

};

subtest 'anonymous listeners' => sub {

subtest '$class' => sub {
my $wire = Beam::Wire->new(
config => {
emitter => {
class => 'My::Emitter',
on => {
greet => {
'$class' => 'My::Listener',
'$method' => 'on_greet',
},
},
},
},
);

my $svc;
lives_ok { $svc = $wire->get( 'emitter' ) };
isa_ok $svc, 'My::Emitter';

$svc->emit( 'greet' );
is $My::Listener::LAST_CREATED->events_seen, 1;
};

subtest '$extends' => sub {
my $wire = Beam::Wire->new(
config => {
emitter => {
class => 'My::Emitter',
on => {
greet => {
'$extends' => 'listener',
'$method' => 'on_greet',
},
},
},
listener => {
class => 'My::Listener',
},
},
);

my $svc;
lives_ok { $svc = $wire->get( 'emitter' ) };
isa_ok $svc, 'My::Emitter';

$svc->emit( 'greet' );
is $My::Listener::LAST_CREATED->events_seen, 1;
};

};


done_testing;
6 changes: 6 additions & 0 deletions t/lib/My/Listener.pm
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ package

use Moo;

our $LAST_CREATED;

sub BUILD {
$LAST_CREATED = $_[0];
}

has events_seen => (
is => 'rw',
default => sub { 0 },
Expand Down

0 comments on commit f1e424b

Please sign in to comment.