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

Next post: MOPing with Moose