Backbone-Events
view release on metacpan or search on metacpan
lib/Backbone/Events.pm view on Meta::CPAN
package Backbone::Events;
$Backbone::Events::VERSION = '0.0.3';
use Carp qw(confess);
use List::MoreUtils qw(any none);
use Scalar::Util qw(blessed);
use Moo::Role;
use namespace::autoclean -also => qr/^__/;
# ABSTRACT: a port of the Backbone.js event API
has _bbe_events => (
is => 'ro',
default => sub { {} },
);
has _bbe_id => (
is => 'ro',
default => sub { __new_id() },
);
has _bbe_listening_to => (
is => 'ro',
default => sub { {} },
);
our $__last_id;
sub __new_id { ++$__last_id }
sub _bbe_trigger {
my ($self, $event_ref, $event, @args) = @_;
my $cb = $event_ref->{cb};
if (any {$_ eq 'all'} @{$event_ref}{qw(ns type)}) {
$cb->($event, @args);
} else {
$cb->(@args);
}
if ($event_ref->{once}) {
my ($event, $listen_id) = @{$event_ref}{qw(event listen_id)};
$self->off($event, $cb, listen_id => $listen_id//'');
}
}
sub __wrap_multiple_events {
my ($orig, $self, $events, @args) = @_;
if (ref $events eq 'HASH') {
$self->$orig($_, $events->{$_}, @args) for keys %$events;
} elsif ($events and $events =~ /\s+/) {
my $result;
$result = $self->$orig($_, @args) for split /\s+/, $events;
# return last result
return $result;
} else {
return $self->$orig($events, @args);
}
}
sub ___wrap_multiple_events2 {
my ($orig, $self, $other, $events, @args) = @_;
if (ref $events eq 'HASH') {
$self->$orig($other, $_, $events->{$_}, @args) for keys %$events;
} elsif ($events and $events =~ /\s+/) {
my $result;
$result = $self->$orig($other, $_, @args) for split /\s+/, $events;
# return last result
( run in 1.719 second using v1.01-cache-2.11-cpan-39bf76dae61 )