sub new { my $type = shift; my $class = ref $type || $type; my $self = { trap => [], cfg => shift }; bless $self, $class; return sub { $self->receiver(@_) }; } sub _default_receiver { my ($self,$vars) = @_; my $fd; if ( my $pid = open($fd, "|-" )){ # Fork $fd->autoflush(); $__PACKAGE__::to_die{$pid}=$self; $self->{receiver} = sub { # Replace receiver in parent my ($self1,$v)= @_; store_fd($v,$fd); # Send }; $self->receiver($vars); # The first trap }else{ $self->init(); # Init child here while ( my $v = fd_retrieve( \*STDIN ) ) { my $r = {}; ... do some work here .... push @{$self->{trap}},$r; $self->handler(); } $self->destroy(); } }