On Wed, Feb 18, 2004 at 08:13:15PM +0000, James Brown wrote: > Hi All, > > A quick question here. > > I have read the POE Cookbook example on broadcasting events (more > correctly, multicasting events) to various sessions and I'd like to > implement it (for keypress events) in my program. > > I intend to have a hash in my 'master' session and pass this hash (by > reference) to all the various child sessions which would like to > 'subscribe' to receive keypress events. They can then add their > $_[SESSION]->ID()'s to the hash. Another child session, somewhere else > in the program, will then post keypress events to all the key's in the hash. > > My question is this: Passing the hash around is quite a lot of work - > I'm sending it to a spawn() method and then from there to the child > session's heap. Is there an alternative method? > > Is it possible for my 'master' session to find the SESSION ID's of it's > children? Is there any way for the children to gain access and modify > the master's heap?
The chat server recipe accomplishes this by keeping the hash in an outer scope, where it's available to all the sessions that want to exchange information. A better implementation would be to create a simple object with just a few methods. Here's an off-the-cuff (untested!) prototype: package Channel; sub new { my $class = shift; return bless { }, $class; } sub enter { my ($self, $session_id) = @_; $self->{$session_id} = 1; } sub leave { my ($self, $session_id) = @_; delete $self->{$session_id}; } sub send { my ($self, $sender_id, $event, @params) = @_; foreach (keys %$self) { next if $_ == $sender_id; # not back to me $poe_kernel->post($_, $event, @params); } } 1; -- Rocco Caputo - [EMAIL PROTECTED] - http://poe.perl.org/