The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
# vim: ts=2 sw=2 noexpandtab

use warnings;
use strict;
use lib qw(../lib);

# Demonstrate how wheels may be encapsulated in thin,
# configuration-only subclasses.

{
	package Runner;
	use Moose;
	extends 'Reflex::Base';
	use Reflex::POE::Wheel::Run;
	use Reflex::Callbacks qw(cb_role);

	has wheel => (
		isa => 'Reflex::POE::Wheel::Run|Undef',
		is  => 'rw',
	);

	sub BUILD {
		my $self = shift;

		$self->wheel(
			Reflex::POE::Wheel::Run->new(
				Program => "$^X -wle 'print qq[pid(\$\$) moo(\$_)] for 1..10; exit'",
				cb_role($self, "child"),
			)
		);
	}

	sub on_child_stdin {
		print "stdin flushed\n";
	}

	sub on_child_stdout {
		my ($self, $stdout) = @_;
		print "stdout: ", $stdout->octets(), "\n";
	}

	sub on_child_stderr {
		my ($self, $stderr) = @_;
		print "stderr: ", $stderr->octets(), "\n";
	}

	sub on_child_error {
		my ($self, $error) = @_;
		return if $error->function() eq "read";
		print $error->formatted(), "\n";
	}

	sub on_child_close {
		my ($self, $args) = @_;
		print "child closed all output\n";
	}

	sub on_child_signal {
		my ($self, $args) = @_;
		print "child $args->{pid} exited: $args->{exit}\n";
		$self->wheel(undef);
	}
}

# Main.

# TODO - SIGCHLD isn't delivered properly.

my $runner_1 = Runner->new();
my $runner_2 = Runner->new();

Reflex->run_all();
exit;