package PoCoRunner; 
use strict; 
use warnings; 
use POE::Wheel::Run; 
use POE; 

our $PKG = __PACKAGE__; 

########################################### 
sub new { 
########################################### 
  my($class, %options) = @_; 

  my $self = { %options }; 

  POE::Session->create( 
    package_states => [ 
      $PKG => [ qw(_start stdout 
                   finish run) ] 
    ], 
    heap => { self => $self }, 
  ); 

  bless $self, $class; 
} 

########################################### 
sub _start { 
########################################## 
  my ($kernel, $session) = 
                       @_[KERNEL, SESSION]; 
  $kernel->post($session, "run"); 
} 

########################################### 
sub run { 
########################################### 
  my ($kernel, $heap, $session) = 
                 @_[KERNEL, HEAP, SESSION]; 

  my $wheel = POE::Wheel::Run->new( 
    Program    => $heap->{self}->{command}, 
    ProgramArgs => [$heap->{self}->{args}], 
    StdoutEvent => "stdout", 
    ErrorEvent  => "finish", 
    CloseEvent  => "finish", 
  ); 

  $heap->{"wheel"}  = $wheel; 
  $heap->{"stdout"} = ""; 
} 
 
########################################### 
sub stdout { 
########################################### 
  my ($input, $heap) = @_[ARG0, HEAP]; 

  $heap->{stdout} .= "$input\n"; 
} 

########################################### 
sub finish { 
########################################### 
  my ($kernel, $heap) = @_[KERNEL, HEAP]; 

  ${ $heap->{self}->{data} } = 
                           $heap->{stdout}; 

  $kernel->delay("run", 
                $heap->{self}->{interval}); 
} 

1;
