$world->on( create => sub { say "Hello" } )
Hello Perl world...
I've been working on creating better sugar for event-driven systems in Perl– specifically, AnyEvent powered things. AnyEvent, and the modules it bundles, encourage a function based callback API, with at most one event listener per callback. Third party modules either follow that model, or the one presented by Object::Event, either using it directly, or implementing something that looks similar, but doesn't work the same.
What actually drove me to do this was exploring Node.js and its event API, which I find much more pleasant then any of the prior art on the CPAN.
So as such, I created a module, On::Event, which is on the CPAN now in a preliminary form. I've been toying with renaming it to ONE, however, as you can see on Github. The resulting API looks like this:
It's implemented as a Mo[ou]se Role, so it can be added to a class without impacting your inheritance. It uses Mo[ou]se::Exporter to hand out Mo[ou]se's sugar along with its own:
package Example;
use MooseX::Event;
has_event 'someevent';
sub do_stuff {
my $self = shift;
$self->emit( someevent => "arg1", "arg2", "argn" );
}
And then use it like this:
my $obj = Example->new;
$obj->once( someevent => sub { ... } );
my $other = $obj->on( someevent => sub { ... } );
$obj->do_stuff(); # Both of the above event handlers are triggered
$obj->do_stuff(); # Only the second event handler is triggered
$obj->remove_event( someevent => $other );
$obj->do_stuff(); # No events trigger