Class-Publisher
view release on metacpan or search on metacpan
lib/Class/Publisher.pm view on Meta::CPAN
390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426name/object an additional parameter
before
the publisher item
=over 4
=item Class subscribers
Class subscribers are notified of events via the class's C<update()> method:
package My::Subscriber;
sub update {
my ($class, $publisher, $event, @args) = @_;
if ($event eq 'reload') {
# ...
} elsif ($event eq 'refresh') {
}
# ...
}
Class notifications can be routed to other methods. See C<add_subscriber()>.
=item Object subscribers
Object subscribers are notified of events via the object's C<update()> method:
package My::Subscriber;
sub update {
my ($self, $publisher, $event, @args) = @_;
# ...
}
Object notifications can be routed to other methods. See C<add_subscriber()>.
=item Subroutine subscribers
package My::Subscriber;
t/Telephone.pm view on Meta::CPAN
828384858687888990919293949596979899100101102
$self
->{hangup} =
$reason
;
}
sub
speak {
my
$self
=
shift
;
my
(
$words
) =
@_
;
TRACE(
$self
->{number} .
" saying '$words'"
);
$self
->notify_subscribers(
'communicate'
,
words
=>
$words
);
}
sub
update {
my
$self
=
shift
;
my
(
$other_party
,
$action
,
%params
) =
@_
;
if
(
$action
eq
'communicate'
) {
TRACE(
$self
->{number} .
" heard '$params{words}'"
);
push
@{
$self
->{listened_to}},
$params
{words};
}
}
sub
TRACE {
$DEBUG
&&
STDERR
@_
, $/ }
t/publisher.t view on Meta::CPAN
222324252627282930313233343536373839404142eval
{Mini_Publisher->add_subscriber(
'test'
, [])};
ok($@,
'subscriber reference should be a blessed object'
);
eval
{Mini_Publisher->add_subscriber(
'test'
,
''
)};
ok($@,
'subscriber cant be empty string'
);
# Test class subscription
sub
catch_all {
$event
{all}++ }
sub
catch_specific {
$event
{specific}++ }
sub
update {
$event
{update}++ }
sub
catch_all_again {}
sub
catch_all_object {}
$rv
= Mini_Publisher->add_subscriber(
undef
, \
&catch_all
);
is (
$rv
, 1,
'class->add_subscriber(undef, \&code)'
);
@s
= Mini_Publisher->get_subscribers();
is_deeply (\
@s
, [\
&catch_all
],
'class->get_subscribers()'
);
$rv
= Mini_Publisher->add_subscriber(
'*'
, \
&catch_all_again
);
is (
$rv
, 2,
'class->add_subscriber("*", \&code)'
);
t/publisher.t view on Meta::CPAN
7677787980818283848586878889909192939495$rv
= Mini_Publisher->add_subscriber(
'specific_event'
,
'main'
);
is (
$rv
, 2,
'class->add_subscriber("specific_event", Class)'
);
Mini_Publisher->notify_subscribers(
'specific_event'
);
is_deeply(\
%event
, {
all
=> 1,
specific
=> 1,
update
=> 1},
'class->notify_subscribers(specific_event) notified "*" as well'
);
# Test object subscription
package
Mini_Subscriber;
sub
new {
bless
{},
shift
};
sub
update {
shift
->{update}++};
sub
custom_update {
shift
->{custom_update}++};
package
main;
my
$subscriber
= new Mini_Subscriber;
$rv
= Mini_Publisher->add_subscriber(
'custom_event'
,
$subscriber
);
is (
$rv
, 1,
'class->add_subscriber("specific_event", object)'
);
Mini_Publisher->notify_subscribers(
'custom_event'
);
is(
$subscriber
->{update}, 1,
'object subscriber notified via object->update'
);
( run in 0.237 second using v1.01-cache-2.11-cpan-cba739cd03b )