Class-Publisher

 view release on metacpan or  search on metacpan

lib/Class/Publisher.pm  view on Meta::CPAN

name/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

    $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 && print STDERR @_, $/ }

t/publisher.t  view on Meta::CPAN


eval {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

$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.248 second using v1.01-cache-2.11-cpan-cba739cd03b )