package BCast; sub spawn { my ($package, $alias) = @_; POE::Session->create( package_states => [$package => [qw(_start xmit join split)],], args => [$alias], ); } sub _start { my ($kernel, $alias) = @_[KERNEL, ARG0]; $kernel->alias_add($alias); $heap->{reg} = []; } sub xmit { my ($kernel, $heap, $something) = @_[KERNEL, HEAP, ARG0]; foreach my $s (@{$heap->{reg}}) { $kernel->post(@$s, $something); } } sub join { my ($kernel, $heap, $something) = @_[KERNEL, HEAP, ARG0]; push @{$heap->{reg}}, $something; } sub split { my ($kernel, $heap, $something) = @_[KERNEL, HEAP, ARG0]; $heap->{reg} = [ grep { $_->[0] ne $something->[0] or $_->[1] ne $something->[1] } @{$heap->{reg}]; } < /perl> With this form, it becomes dead simple to reuse code. Simply overload the the package: <perl> package BCast::Once; @ISA = qw(BCast); sub join { my ($sender, $heap, $something) = @_[SENDER, HEAP, ARG0]; $heap->{joined}{$sender->ID}{$something} = 1; delete $heap->{reg}; } sub split { my ($sender, $heap, $something) = @_[SENDER, HEAP, ARG0]; my $sender = $sender->ID; if ($something) { delete $heap->{already}{$sender}{$something}; delete $heap->{already}{$sender} unless keys %{$heap->{already}{$sender}}; } else { delete $heap->{already}{$sender}; } delete $heap->{reg}; } sub xmit { my ($heap) = $_[HEAP]; $heap->{reg} ||= [map { keys %$_ } keys %{$heap->{already}}]; $package = shift @_; $package->SUPER::xmit(@_); }
Advantages
- Intelligent use of packages.
- Event name == subroutine name.
Disadvantages
- You depend on the heap.
- Some folks don't like OO.
- Because @_ has so much in it, one has to do silly things like C<< shift(@_)->SUPER::subroutine(@_); >> to call parent methods.
- Non-POE related methods won't have access to $_[HEAP] where we store all information.
See also: /Anonymous Inline Subrefs, /Inline Subrefs, /Object Methods.