POE-Component-Child
view release on metacpan or search on metacpan
/;
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 )