###########################################
package PoCoRunner;
# Mike Schilli, 2007 (m@perlmeister.com)
###########################################
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;
