POE::Session->create( inline_states => { _start => \&start_event, xmit => \&xmit_event, join => \&join_event, split => \&split_event, }, args => [$alias], ); sub start_event { my ($kernel, $alias) = @_[KERNEL, ARG0]; $kernel->alias_add($alias); $heap->{reg} = []; } sub xmit_event { my ($kernel, $heap, $something) = @_[KERNEL, HEAP, ARG0]; foreach my $s (@{$heap->{reg}}) { $kernel->post(@$s, $something); } } sub join_event { my ($sender, $heap, $something) = @_[SENDER, HEAP, ARG0]; push @{$heap->{reg}}, [$sender->ID, $something]; } sub split_event { my ($sender, $heap, $something) = @_[SENDER, HEAP, ARG0]; $sender = $sender->ID; $heap->{reg} = [grep { $_->[0] ne $sender] or $_->[1] ne $something } @{$heap->{reg}]; } < /perl> This is the easiest form for a novice to understand. No packages, no objects, just straight subroutines like everyone else. For code reuse, simply reference the subs from another package. <perl> POE::Session->create( inline_states => { _start => \&start_event, xmit => \&xmit_event, join => \&one_join_event, split => \&one_split_event, }, args => [$alias], ); sub one_join_event { my ($sender, $heap, $something) = @_[SENDER, HEAP, ARG0]; $sender = $sender->ID; push @{$heap->{reg}}, [$sender, $something] unless $heap->{already}{$sender}{$something}++; } sub one_split_event { 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}; } $heap->{reg} = [grep { $heap->{already}{$_->[0]} and $heap->{already}{$_->[0]}{$_->[1]} } @{$heap->{reg}}]; }
Advantages
- Easy to understand.
- Good code reuse (Exporter).
- Event name isn't necessarily the same as the subroutine name that implements it.
Disadvantages
- Name space pollution.
- Event name isn't necessarily the same as the subroutine name that implements it.
- SUPER:: not available.
See also: /Anonymous Inline Subrefs, /Package Methods, /Object Methods.