On Thu, Aug 28, 2003 at 06:09:42AM -0500, Jake wrote:
> I must not be explaining myself, or it's so basic people are overlooking the
> obvious, thinking I want to do something more complicated.
> 
> Here is what I want to do.
> 
> I want to pass reference (my own) to one of the events.  That way within the
> event I have access to reference passed.
> 
> In non-poe code I'd do:
> 
> sub one {
>     my $data;
>     two(\$data);
> }
> 
> sub two {
>     my $data = shift;
>     $$data = "I'm setting it here"
> }
> 
> 
> In POE I'd like accomplish the same but I don't know how to get put an extra
> parameter in to the parameter list sent by an event.  I tried this (but
> obviously it doesn't work):
> 
> sub one {
>     my $data;
> 
>     my $poe = POE::Component::Client::TCP->new(
>         ...
>         ## Notice the reference to $data in the line below
>         ServerInput     => \&serverResponse(\$data)
>     );
> }
> 
> sub serverResponse {
>     # HERE I'd like to get at the reference to $data
> }

This goes a long way toward explaining your intention.  There are at
least two ways to do it.

First, you can set up a Started handler, which will be called back when
the client component has started.  When it is called, the contents of
the Args parameter will be passed to it as @_[ARG0..$#_].

There are at least two ways to do it:

  sub one {
    my $data;
    my $client = POE::Component::Client::TCP->new(
      ...,
      ServerInput => \&serverResponse,
      Started => \&serverStarted,
      Args => [ \$data ],
    );
  }

  sub serverStarted {
    my $data_ref = $_[ARG0];
    ...,
    # And if you want it available from serverStarted:
    $_[HEAP]->{data_ref} = $data_ref;
  }

  # Once it's in the "heap", it is available to all event handlers in
  # the same session.  Other sessions have their own, different heaps,
  # so they will see different (or no) values for it.

  sub serverResponse {
    my $data_ref = $_[HEAP]->{data_ref};
  }

Another way is to use a closure, which requires an inline anonymous sub
for the ServerInput handler.  Closures can be difficult to work with,
and in this case will double the function-call overhead for each unit of
server input.

  sub one {
    my $data;
    my $client = POE::Component::Client::TCP->new(
      ...,
      ServerInput => sub { serverResponse($data, $_[ARG0]) },
    );
  }

As a side effect of the above example, your serverResponse() handler
will only receive two parameters:

  my ($data_ref, $input) = @_;

If it needs access to a HEAP or KERNEL, it must get them elsewhere, or
you must pass them in yourself.

Finally, this is not related to your problem at hand, but it's a way to
pass information from one event handler to another without using a HEAP.

  $kernel->post(some_session => some_event => \$data);
  $kernel->yield(some_event => \$data);

  sub some_event_handler {
    my $data_ref = $_[ARG0];
    ...,
  }

The yield() method is just a poorly named version of post() that assumes
"some_session" is the same one it's called from.

-- 
Rocco Caputo - [EMAIL PROTECTED] - http://poe.perl.org/

Reply via email to