Evented-Object
view release on metacpan or search on metacpan
lib/Evented/Object.pm view on Meta::CPAN
use utf8;
use 5.010;
# these must be set before loading EventFire.
our ($events, $props, %monitors);
BEGIN {
$events = 'eventedObject.events';
$props = 'eventedObject.props';
}
use Scalar::Util qw(weaken blessed);
use Evented::Object::EventFire;
use Evented::Object::Collection;
our $VERSION = '5.68';
# creates a new evented object.
sub new {
my ($class, %opts) = @_;
bless \%opts, $class;
}
lib/Evented/Object.pm view on Meta::CPAN
#
sub add_listener {
my ($eo, $obj, $prefix) = @_;
# find listeners list.
my $listeners = $eo->{$props}{listeners} ||= [];
# store this listener.
push @$listeners, [$prefix, $obj];
# weaken the reference to the listener.
weaken($listeners->[$#$listeners][1]);
return 1;
}
# ->delete_listener()
#
# removes an object which was listening to another object's events.
# see "listeners" in the documentation.
#
sub delete_listener {
lib/Evented/Object.pm view on Meta::CPAN
# ensure it's an evented object.
return unless $obj->isa(__PACKAGE__);
# it's already in the list.
my $m = $monitors{$pkg} ||= [];
return if grep { $_ == $obj } @$m = grep { defined } @$m;
# hold a weak reference to the monitor.
push @$m, $obj;
weaken($monitors{$pkg}[$#$m]);
return 1;
}
# delete_class_monitor()
#
# remove a class monitor object from a class.
#
sub delete_class_monitor {
my ($pkg, $obj) = @_;
lib/Evented/Object.pm view on Meta::CPAN
# add callbacks from each store.
foreach my $st (@stores) {
my ($event_name, $event_store) = @$st;
my $store = $event_store->{$event_name} or next;
foreach my $priority (keys %$store) {
# create a group reference.
my $group_id = "$eo/$event_name";
my $group = [ $eo, $event_name, \@args, $group_id ];
weaken($group->[0]);
# add each callback set. inject callback name.
foreach my $cb_ref (@{ $store->{$priority} }) {
my %cb = %$cb_ref; # make a copy
$cb{id} = "$group_id/$cb{name}";
$callbacks{ $cb{id} } = [ $priority, $group, \%cb ];
$callback_names{$group_id}{ $cb{name} } = $cb{id};
}
}
lib/Evented/Object/Collection.pm view on Meta::CPAN
# Evented::Object: a simple yet featureful base class event framework.
# https://github.com/cooper/evented-object
#
package Evented::Object::Collection; # leave this package name the same FOREVER.
use warnings;
use strict;
use utf8;
use 5.010;
use Scalar::Util qw(weaken blessed);
use List::Util qw(min max);
use Carp qw(carp);
our $VERSION = '5.68';
our $events = $Evented::Object::events;
our $props = $Evented::Object::props;
my $dummy;
my %boolopts = map { $_ => 1 } qw(safe return_check fail_continue);
lib/Evented/Object/Collection.pm view on Meta::CPAN
blessed $eo && $eo->isa('Evented::Object') or return;
# callback name-to-ID mapping is specific to each group.
$ef_props->{callback_ids} = $collection->_group_names($group_id);
# increment the callback counter.
$ef_props->{callback_i}++;
# set the evented object of this callback.
# set the event name of this callback.
$ef_props->{object} = $eo; weaken($ef_props->{object}); # $fire->object
$ef_props->{name} = $event_name; # $fire->event_name
# store identifiers.
$ef_props->{callback_id} = my $cb_id = $cb->{id};
$ef_props->{group_id} = $group_id;
# create info about the call.
$ef_props->{callback_name} = $cb->{name}; # $fire->callback_name
$ef_props->{callback_priority} = $priority; # $fire->callback_priority
$ef_props->{callback_data} = $cb->{data} if defined $cb->{data}; # $fire->callback_data
( run in 0.263 second using v1.01-cache-2.11-cpan-65fba6d93b7 )