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

# Demonstrate Runner.pm used with other open3-like things.

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

use Runner;

my $cmd = q(
	perl -MTime::HiRes=sleep -wle '
		$| = 1;
		for (1..3) { $_ = qq[pid($$) moo($_)]; print; warn "$_\n"; sleep rand; }
	'
);

sub my_start {
	my ($host, $cmd) = @_;

	use Net::SSH qw(sshopen3);
	use Symbol qw(gensym);

	my ($fh_in, $fh_out, $fh_err) = (gensym(), gensym(), gensym());

	my $pid = sshopen3($host, $fh_in, $fh_out, $fh_err, $cmd);

	return($pid, $fh_in, $fh_out, $fh_err);
}

my $runner_1;
{
	my ($pid, $fh_in, $fh_out, $fh_err) = my_start('remote.example.com', $cmd);

	$runner_1 = Runner->new(
		stdin   => $fh_in,
		stdout  => $fh_out,
		stderr  => $fh_err,
		pid     => $pid,

		on_stdout_closed  => sub { print "runner_1 stdout closed\n" },
		on_stderr_closed  => sub { print "runner_1 stderr closed\n" },
		on_stdout_data    => sub { print "runner_1 stdout: ", $_[1]->octets() },
		on_stderr_data    => sub { print "runner_1 stderr: ", $_[1]->octets() },

		on_exit   => sub {
			my ($self, $child) = @_;
			warn "runner_1 child ", $child->pid(), " exited: ", $child->exit(), "\n";
			$runner_1 = undef;
		},
	);
}

my $runner_2;
{
	my ($pid, $fh_in, $fh_out, $fh_err) = my_start('remote.example.com', $cmd);

	$runner_2 = Runner->new(
		stdin   => $fh_in,
		stdout  => $fh_out,
		stderr  => $fh_err,
		pid     => $pid,

		on_stdout_closed  => sub { print "runner_2 stdout closed\n" },
		on_stderr_closed  => sub { print "runner_2 stderr closed\n" },
		on_stdout_data    => sub { print "runner_2 stdout: ", $_[1]->octets() },
		on_stderr_data    => sub { print "runner_2 stderr: ", $_[1]->octets() },

		on_exit   => sub {
			my ($self, $child) = @_;
			warn "runner_2 child ", $child->pid(), " exited: ", $child->exit(), "\n";
			$runner_2 = undef;
		},
	);
}

Reflex->run_all();
exit;