package Child::Link::IPC;
use strict;
use warnings;

use Child::Util;

use base 'Child::Link';

add_accessors qw/ipc/;
add_abstract qw/

sub init {}

sub new {
    my $class = shift;
    my ( $pid, @shared ) = @_;
    my $self = $class->SUPER::new($pid);
    $self->init( @shared );
    return $self;

sub autoflush {
    my $self = shift;
    my ( $value ) = @_;
    my $write = $self->write_handle;

    my $selected = select( $write );
    $| = $value if @_;
    my $out = $|;

    select( $selected );

    return $out;

sub flush {
    my $self = shift;
    my $orig = $self->autoflush();
    my $write = $self->write_handle;

sub read {
    my $self = shift;
    my $handle = $self->read_handle;
    return <$handle>;

sub say {
    my $self = shift;
    $self->write( map {$_ . $/} @_ );

sub write {
    my $self = shift;
    my $handle = $self->write_handle;
    print $handle @_;


=head1 NAME

Child::Link::IPC - Base class for process links that provide IPC.

=head1 SEE ALSO

This class inherits from:

=over 4

=item L<Child::Link>


=head1 METHODS

=over 4

=item $proc->new( $pid. @shared )


=item $proc->read()

Read a message from the child.

=item $proc->write( @MESSAGES )

Send the messages to the child. works like print, you must add "\n".

=item $proc->say( @MESSAGES )

Send the messages to the child. works like say, adds the separator for you
(usually "\n").

=item $proc->autoflush( $BOOL )

Turn autoflush on/off for the current processes write handle. This is on by

=item $proc->flush()

Flush the current processes write handle.

=item $proc->ipc()

=item $proc->_ipc( $new )

Accessors for you to use or ignore.



=over 4

=item $proc->read_handle()

Should return a read handle for reading from the child.

=item $proc->write_handle()

Should return a write handle for writing to the child.

=item $proc->init( @shared )

Called by new during construction


=head1 HISTORY

Most of this was part of L<Parallel::Runner> intended for use in the L<Fennec>
project. Fennec is being broken into multiple parts, this is one such part.


This module is part of the Fennec project. See L<Fennec> for more details.
Fennec is a project to develop an extendable and powerful testing framework.
Together the tools that make up the Fennec framework provide a potent testing

The tools provided by Fennec are also useful on their own. Sometimes a tool
created for Fennec is useful outside the greater framework. Such tools are
turned into their own projects. This is one such project.

=over 2

=item L<Fennec> - The core framework

The primary Fennec project that ties them all together.


=head1 AUTHORS

Chad Granum L<>


Copyright (C) 2010 Chad Granum

Child is free software; Standard perl licence.

Child is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the license for more details.