title: How to undersand the POE-Tk use of destroy?
body: <p>Here is some test code to illustrate my problem;</p>
  
  <pre><code>
  use Tk;
  use POE qw( Loop::TkActiveState );
  use Tk::Toplevel;
  
  POE::Session->create(
      inline_states => {
          _start      => \&ui_start
          ,top1       => \&top1
          ,top2       => \&top2
  #       ,kill_top1  => \&kill_top1
          ,kill_top1  =>  sub {
              $heap->{tl1}->destroy;
          }
          ,over       => sub { exit }
      }
  );
  
  $poe_kernel->run();
  exit 0;
  
  sub ui_start {
      my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
      $heap->{mw} = $poe_main_window;
      $but1 = $heap->{mw}->Button(
          -text => 'Exit',
          -width => 12,
          -command => $session->postback("over")
      )->pack( -padx => 7,
          -side => 'left',
          -expand => 0 );
  
      $but2 = $heap->{mw}->Button(
          -text => 'Top1',
          -width => 12,
          -command => $session->postback("top1")
      )->pack( -padx => 7,
          -side => 'left',
          -expand => 0 );
      $but2 = $heap->{mw}->Button(
          -text => 'Top2',
          -width => 12,
          -command => $session->postback("top2")
      )->pack( -padx => 7,
          -side => 'left',
          -expand => 0 );
      $but3 = $heap->{mw}->Button(
          -text => 'Kill TL',
          -width => 12,
          -command => $session->postback("kill_top1")
      )->pack( -padx => 7,
          -side => 'left',
          -expand => 0 );
  }
  
  sub top1 {
      my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
      unless(Tk::Exists($heap->{tl1})) {
          $heap->{tl1} = $heap->{mw}->Toplevel( title => "Top1");
      }
  }   
  
  sub top2 {
      my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
      $heap->{tl2} = $heap->{mw}->Toplevel( title => "Top2");
      $heap->{tl1}->destroy if Tk::Exists($heap->{tl1});
  }   
  
  sub kill_top1 {
      my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
      $heap->{tl1}->destroy if Tk::Exists($heap->{tl1});
  }
  </code></pre>
  
  <p>If I uncomment the version of the inline state kill_top1, all is well.  If I use the version (as shown) that calls the anonymous sub, I get;</p>
  
  <pre><code>
  C:\scripts\alias\resource>alias_poe_V-3_0_par.pl
   error:Can't call method "destroy" on an undefined value at C:\scripts\alias\res
  ource\alias_poe_V-3_0_par.pl line 328,  line 365.
  
  Tk::Error: Can't call method "destroy" on an undefined value at C:\scripts\alias
  \resource\alias_poe_V-3_0_par.pl line 328,  line 365.
   Tk::After::once at C:/Perl/site/lib/Tk/After.pm line 89
   [once,[{},undef,100,once,[\&POE::Kernel::_poll_for_io]]]
   ("after" script)
  </code></pre>
  
  <p>In this posting [link text][1] Rocco Caputo explains;</p>
  
  <p>"Tk is not passing the event information to POE.</p>
  
  <p>As you know, postbacks are anonymous subroutine references that post POE events when they're called. They're used as a thin, flexible interface between POE and Tk, among other things.</p>
  
  <p>Postbacks are blessed, and their DESTROY methods are used to notify POE when Tk is done with them. From Tk's point of view, the only difference between a callback and a postback is this blessing.</p>
  
  <p>For some reason, Tk does not pass parameters to a blessed callback."</p>
  
  <p>He gives a workaround, but I am not sure 1) if this is the issue I have uncovered or )2 if it is, how to apply the workaround.</p>
  
  <p>[1]: <a href="http://osdir.com/ml/lang.perl.poe/2004-01/msg00002.html" rel="nofollow noreferrer">http://osdir.com/ml/lang.perl.poe/2004-01/msg00002.html</a> :Tk With POE - bind() function for keypresses"</p>