=head1 NAME

IOMux::Pipe::Write - write to an external command

=head1 INHERITANCE

 IOMux::Pipe::Write
   is a IOMux::Handler::Write
   is a IOMux::Handler

=head1 SYNOPSIS

  my $mux = IOMux::Select->new;  # or ::Poll

  use IOMux::Open '|-';
  my $pipe = $mux->open('|-', $command, @cmd_options);

  use IOMux::Pipe::Write;
  my $pipe = IOMux::Pipe::Write->new
    (command => [$command, @cmd_options]);
  $mux->add($pipe);

  $pipe->write($text);
  $pipe->print($text);

  write $pipe $text;
  print $pipe $text;

=head1 DESCRIPTION

In an event driven program, you must be careful with every Operation
System call, because it can block the event mechanism, hence the program
as a whole. Often you can be lazy with writes, because its communication
buffers are usually working quite asynchronous... but not always. You
may skip the callbacks for small writes and prints.

=head1 METHODS

=head2 Constructors

=over 4

=item IOMux::Pipe::Write-E<gt>B<bare>(OPTIONS)

Creates a pipe, but does not start a process (yet). Used by
L<IOMux::IPC|IOMux::IPC>, which needs three pipes for one process. Returned
is not only a new pipe object, but also a read handle to be
connected to the other side.

All OPTIONS which are available to L<IOMux::Handler::Write::new()|IOMux::Handler::Write/"Constructors">
can be used here as well.

 -Option   --Default
  read_size  4096

=over 2

=item read_size => INTEGER

=back

example: 

  my ($in, $in_rh)
      = IOMux::Pipe::Write->bare(name => 'stdin');

=item IOMux::Pipe::Write-E<gt>B<new>(OPTIONS)

 -Option    --Defined in     --Default
  command                      <required>
  fh          IOMux::Handler   <required>
  name        IOMux::Handler   '|$cmd'
  write_size  IOMux::Handler::Write  4096

=over 2

=item command => COMMAND|ARRAY

The external command to be executed. Either the COMMAND needs to
parameters, or you need to pass an ARRAY of the command name and
all its parameters.

=item fh => FILEHANDLE

=item name => STRING

=item write_size => INTEGER

=back

=item IOMux::Pipe::Write-E<gt>B<open>(MODE, (CMD, CMDOPTS)|(CMDARRAY, OPTIONS))

Open the pipe to write. MODE is always C<< -| >>.  When you need to
pass additional OPTIONS to the implied L<new()|IOMux::Pipe::Write/"Constructors">, then you must use
an ARRAY for command name and its optional parameters.

example: 

  my $mux = IOMux::Poll->new;
  $mux->open('|-', 'lpr', '-#4');  # no opts
  $mux->open('|-', ['lpr', '-#4'], %opts);
  $mux->open('|-', 'lpr');        # no opts
  $mux->open('|-', ['lpr'], %opts);

=back

=head2 Accessors

=over 4

=item $obj-E<gt>B<childPid>

The process id of the child on the other side of the pipe.

=item $obj-E<gt>B<fh>
See L<IOMux::Handler/"Accessors">

=item $obj-E<gt>B<fileno>
See L<IOMux::Handler/"Accessors">

=item $obj-E<gt>B<mode>

The bits of the open mode.

=item $obj-E<gt>B<mux>
See L<IOMux::Handler/"Accessors">

=item $obj-E<gt>B<name>
See L<IOMux::Handler/"Accessors">

=item $obj-E<gt>B<usesSSL>
See L<IOMux::Handler/"Accessors">

=item $obj-E<gt>B<writeSize>([INTEGER])
See L<IOMux::Handler::Write/"Accessors">

=back

=head2 User interface

=head3 Connection

=over 4

=item $obj-E<gt>B<close>([CALLBACK])
See L<IOMux::Handler/"Connection">

=item $obj-E<gt>B<timeout>([TIMEOUT])
See L<IOMux::Handler/"Connection">

=back

=head3 Writing

=over 4

=item $obj-E<gt>B<print>(STRING|SCALAR|LIST|ARRAY)
See L<IOMux::Handler::Write/"Writing">

=item $obj-E<gt>B<printf>(FORMAT, PARAMS)
See L<IOMux::Handler::Write/"Writing">

=item $obj-E<gt>B<say>(STRING|SCALAR|LIST|ARRAY)
See L<IOMux::Handler::Write/"Writing">

=item $obj-E<gt>B<write>(SCALAR, [MORE])
See L<IOMux::Handler::Write/"Writing">

=back

=head2 Multiplexer

=head3 Connection

=over 4

=item $obj-E<gt>B<mux_init>(MUX, [HANDLER])
See L<IOMux::Handler/"Connection">

=item $obj-E<gt>B<mux_remove>
See L<IOMux::Handler/"Connection">

=item $obj-E<gt>B<mux_timeout>
See L<IOMux::Handler/"Connection">

=back

=head3 Reading

=over 4

=item $obj-E<gt>B<mux_except_flagged>(FILENO)
See L<IOMux::Handler/"Reading">

=item $obj-E<gt>B<mux_read_flagged>(FILENO)
See L<IOMux::Handler/"Reading">

=back

=head3 Writing

=over 4

=item $obj-E<gt>B<mux_outbuffer_empty>
See L<IOMux::Handler::Write/"Writing">

=item $obj-E<gt>B<mux_output_waiting>
See L<IOMux::Handler::Write/"Writing">

=item $obj-E<gt>B<mux_write_flagged>(FILENO)
See L<IOMux::Handler/"Writing">

=back

=head3 Service

=head2 Helpers

=over 4

=item $obj-E<gt>B<extractSocket>(HASH)

=item IOMux::Pipe::Write-E<gt>B<extractSocket>(HASH)
See L<IOMux::Handler/"Helpers">

=item $obj-E<gt>B<fdset>(STATE, READ, WRITE, ERROR)
See L<IOMux::Handler/"Helpers">

=item $obj-E<gt>B<show>
See L<IOMux::Handler/"Helpers">

=back

=head1 SEE ALSO

This module is part of IOMux distribution version 0.12,
built on January 27, 2011. Website: F<http://perl.overmeer.net/>
All modules in this suite:
L</Any::Daemon>,
L</IOMux>, and
L</IOMux::HTTP>.

Please post questions or ideas to F<perl@overmeer.net>

=head1 LICENSE

Copyrights 2011 by Mark Overmeer. For other contributors see ChangeLog.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
See F<http://www.perl.com/perl/misc/Artistic.html>

