Aion-Emitter
view release on metacpan or search on metacpan
lib/Aion/Emitter.pm view on Meta::CPAN
package Aion::Emitter;
# ÐиÑпеÑÑеÑ
use common::sense;
our $VERSION = "0.1.0";
use Aion::Pleroma;
use Aion;
use config {
INI => 'etc/annotation/listen.ann',
EVENT => {},
};
# ÐÑÑÑ Ðº ÑобÑаннÑм из анноÑаÑий меÑодам
has ini => (is => 'ro', isa => Str, default => INI);
# СпиÑок ÑлÑÑаÑелей
has event => (is => 'ro', isa => HashRef[ArrayRef[Dict[pkg => Str, sub => Str, line => Nat, nice => Option[Num], remark => Option[Str]]]], default => sub {
my ($self) = @_;
my %event = %{EVENT()};
if(defined $self->ini and -e $self->ini) {
open my $f, "<:utf8", $self->ini or die "Not open ${\$self->ini}";
while(<$f>) {
close($f), die "${\$self->ini}:$. corrupt!" unless /^([\w:]+)#(\w*),(\d+)=(?:(-?\d+(?:\.\d+)?)\s+)?([a-z][\w:]*(?:#[\w.:-]+)?)(?:\s+(.*?))??\s*$/i;
my ($pkg, $sub, $line, $nice, $evt, $remark) = ($1, $2, $3, $4, $5, $6);
push @{$event{$evt}}, {
pkg => $pkg,
sub => $sub,
line => $line,
$nice? (nice => $nice): (),
$remark ne ''? (remark => $remark): (),
};
}
close $f;
}
for my $listens (values %event) {
@$listens = sort {
$a->{nice} <=> $b->{nice}
or $a->{pkg} cmp $b->{pkg}
or $a->{sub} cmp $b->{sub}
} @$listens;
}
\%event
});
# ÐлеÑома
has pleroma => (is => 'ro', isa => 'Aion::Pleroma', eon => 1);
# ÐзлÑÑиÑÑ
sub emit {
my ($self, $event, $key) = @_;
my $listeners = $self->event->{defined($key)? "${\ref $event}#$key": ref $event};
return $self unless $listeners;
for my $listener_bag (@$listeners) {
my ($pkg, $sub) = @$listener_bag{qw/pkg sub/};
my $listener = $self->pleroma->get($pkg) // $self->pleroma->autoware($pkg)->resolve($pkg);
$listener->$sub($event);
}
$self
}
1;
__END__
=encoding utf-8
=head1 NAME
Aion::Emitter - event dispatcher
=head1 VERSION
0.1.0
=head1 SYNOPSIS
( run in 2.529 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )