BeamX::Peer::Emitter - Beam::Emitter with peer-to-peer messaging
version 0.003
use 5.10.0; use Safe::Isa; sub fmt_msg { $_[0]->$_isa( 'Beam::Event' ) ? sprintf( "received event '%s' from node %s", $_[0]->name, $_[0]->emitter->id ) : join( ' ', @_ ); } package Node { use Safe::Isa; use Moo; with 'BeamX::Peer::Emitter'; has id => ( is => 'ro', required => 1, ); sub recv { my $self = shift; say $self->id, ': ', &::fmt_msg; } } my $n1 = Node->new( id => 'N1' ); my $n2 = Node->new( id => 'N2' ); # standard Beam::Emitter event $n1->subscribe( 'alert', sub { say 'non-peer: ', &fmt_msg } ); # explicit peer event $n1->subscribe( 'alert', sub { $n2->recv( @_ ) }, peer => $n2 ); say "Broadcast Event object:"; $n1->emit( 'alert' ); say "\nSend Event object directly to \$n2"; $n1->send( $n2, 'alert' ); say "\nBroadcast arbitrary args"; $n1->emit_args( 'alert', q[Server's Down!] ); say "\nSend arbitrary args directly to \$n2"; $n1->send_args( $n2, 'alert', q[Let's get coffee!] );
Results in:
Broadcast Event object: non-peer: received event 'alert' from node N1 N2: received event 'alert' from node N1 Send Event object directly to $n2 N2: received event 'alert' from node N1 Broadcast arbitrary args non-peer: Server's Down! N2: Server's Down! Send arbitrary args directly to $n2 N2: Let's get coffee!
BeamX::Peer::Emitter is a role (based upon Beam::Emitter) which adds the ability to notify individual subscribers (peers) of events to Beam::Emitter's publish/subscribe capabilities.
# subscribe as Beam::Emitter does $emitter->subscribe( $event_name, $subref, [, %args] );
Subscribe to the named event from $emitter. $subref will be called when the event is emitted.
$emitter
$subref
By default, the emitter tracks the listener with an object of class BeamX::Peer::Listener. %args is used to pass arguments to its constructor.
%args
To enable $emitter to send the event directly to a $peer via the send method, specify the peer with the peer key in %args.
$peer
peer
$emitter->subscribe( $event_name, $subref, peer => $peer, %args );
To use a different listener class, subclass BeamX::Peer::Emitter and pass its name via the class key in %args.
class
$emitter->subscribe( $event_name, $subref, class => MyListener, %args );
$emitter->send( $peer, $event_name [, %args] );
Send the named event to the specified peer. %args is a list of name, value pairs to pass to the Beam::Event constructor; use the class key to specify an alternate event class.
$emitter->send_args( $peer, $event_name, @args] );
Send the named event to the specified peer. @args will be passed to the subscribed callback.
@args
Beam::Emitter
Diab Jerius <djerius@cpan.org>
This software is Copyright (c) 2016 by the Smithsonian Astrophysical Observatory.
This is free software, licensed under:
The GNU General Public License, Version 3, June 2007
To install BeamX::Peer::Emitter, copy and paste the appropriate command in to your terminal.
cpanm
cpanm BeamX::Peer::Emitter
CPAN shell
perl -MCPAN -e shell install BeamX::Peer::Emitter
For more information on module installation, please visit the detailed CPAN module installation guide.