POE-Component-Child

 view release on metacpan or  search on metacpan

Child.pm  view on Meta::CPAN

        /;

	POE::Session->create(
		object_states => [ $self => \@sh ]
		);

	return $self;
	}

sub run {
	my $self = shift;
	POE::Kernel->call($self->{$PKG}{session}, got_run => \@_);
	}

sub write {
	my $self = shift;
	my $wheel = $self->wheel();
    if (defined $wheel) {
	    $self->debug(qq/write(): "/ . join(" ", @_) . qq/"/);
	    $wheel->put(@_);
        }
    else {
        $self->debug(sprintf(
            q/wheel undefined, refusing to write(): "%s"/, join(" ", @_)
            ));
        }
	}

sub quit {
	my $self = shift;
	my $quit = shift || $self->{$PKG}{writemap}{quit};
	my $id = $self->wheelid();

	$self->{$PKG}{wheels}{$id}{quit} = 1;
	$self->write($quit) if $quit;
    $self->stdin_close();
	}

sub kill {
	my $self = shift;
    local %_ = @_;
    my $sig = $_{HARD} ? 9 : $_{SIG} || 'TERM';
    my $nod = $_{NODIE} || 0;

	my $id = $self->wheelid();
	$self->{$PKG}{wheels}{$id}{quit} = $nod;

	my $pid = $self->wheel()->PID;
	CORE::kill $sig, $pid;
	$self->debug("kill(): $pid");
	}

sub shutdown {
	my $self = shift;
	POE::Kernel->alias_remove("${PKG}::$self->{$PKG}{session}");
	}

sub attr {
	my ($self, $key, $val) = @_;

	my @keys = split m|/|, $key;
	$key = pop @keys;

	my $ref = \$self->{$PKG};
	$ref = \$ref->{$_} for @keys;

	$ref->{$key} = $val if $val;
	return $ref->{$key};
	}

# --- session handlers --------------------------------------------------------

sub _start {
	my ($kernel, $session, $self) = @_[KERNEL, SESSION, OBJECT];
	$self->{$PKG}{session} = $session->ID;
	$self->debug("session-id: $self->{$PKG}{session}");

	# install death handler
    $kernel->sig(CHLD => 'sig_child');

	# to make sure our session sticks around between
	# wheel invocations we set an alias (unique per sesion)

	$kernel->alias_set("${PKG}::$self->{$PKG}{session}");
	}

sub _stop {
	my ($self, $session) = @_[OBJECT, SESSION];

	#	clean remaining wheels

	delete $self->{$PKG}{wheels}{current};
	for my $id (keys %{ $self->{$PKG}{wheels} }) {
		delete $self->{$PKG}{wheels}{$id};
		}

	#	and wipe children

	CORE::kill 9, $_ for keys %{ $self->{$PKG}{pids} };

	# for enlightenment

	$self->debug("_stop=" . $session->ID);
	}

#	not currently handled by the session.  not sure how
#	to propagate

sub _default {
	my $self = $_[OBJECT];
	$self->debug(qq/_default: "$_[ARG0]", args: @{$_[ARG1]}/);
	}

sub got_run {
	my ($kernel, $session, $self, $cmd) = @_[KERNEL, SESSION, OBJECT, ARG0];

	# init stuff

	my $conduit = $self->{$PKG}{conduit};
	$self->{$PKG}{StdioFilter}
		||= POE::Filter::Line->new(OutputLiteral => "\n");



( run in 2.461 seconds using v1.01-cache-2.11-cpan-71847e10f99 )