57 lines
1.2 KiB
Perl
57 lines
1.2 KiB
Perl
use strict; use warnings;
|
|
package IO::All::Pipe;
|
|
|
|
use IO::All -base;
|
|
use IO::File;
|
|
|
|
const type => 'pipe';
|
|
|
|
sub pipe {
|
|
my $self = shift;
|
|
bless $self, __PACKAGE__;
|
|
$self->name(shift) if @_;
|
|
return $self->_init;
|
|
}
|
|
|
|
sub _assert_open {
|
|
my $self = shift;
|
|
return if $self->is_open;
|
|
$self->mode(shift) unless $self->mode;
|
|
$self->open;
|
|
}
|
|
|
|
sub open {
|
|
my $self = shift;
|
|
$self->is_open(1);
|
|
require IO::Handle;
|
|
$self->io_handle(IO::Handle->new)
|
|
unless defined $self->io_handle;
|
|
my $command = $self->name;
|
|
$command =~ s/(^\||\|$)//;
|
|
my $mode = shift || $self->mode || '<';
|
|
my $pipe_mode =
|
|
$mode eq '>' ? '|-' :
|
|
$mode eq '<' ? '-|' :
|
|
$self->throw("Invalid usage mode '$mode' for pipe");
|
|
CORE::open($self->io_handle, $pipe_mode, $command);
|
|
$self->_set_binmode;
|
|
}
|
|
|
|
my %mode_msg = (
|
|
'>' => 'output',
|
|
'<' => 'input',
|
|
'>>' => 'append',
|
|
);
|
|
sub open_msg {
|
|
my $self = shift;
|
|
my $name = defined $self->name
|
|
? " '" . $self->name . "'"
|
|
: '';
|
|
my $direction = defined $mode_msg{$self->mode}
|
|
? ' for ' . $mode_msg{$self->mode}
|
|
: '';
|
|
return qq{Can't open pipe$name$direction:\n$!};
|
|
}
|
|
|
|
1;
|