In this form, all events are mapped to package methods.

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

Disadvantages

See also: /Anonymous Inline Subrefs, /Inline Subrefs, /Object Methods.