Acme-Throw
view release on metacpan or search on metacpan
t/lib/Capture/Tiny.pm view on Meta::CPAN
}
sub _name {
my $glob = shift;
no strict 'refs'; ## no critic
return *{$glob}{NAME};
}
sub _open {
open $_[0], $_[1] or Carp::confess "Error from open(" . join(q{, }, @_) . "): $!";
# _debug( "# open " . join( ", " , map { defined $_ ? _name($_) : 'undef' } @_ ) . " as " . fileno( $_[0] ) . "\n" );
}
sub _close {
# _debug( "# closing " . ( defined $_[0] ? _name($_[0]) : 'undef' ) . " on " . fileno( $_[0] ) . "\n" );
close $_[0] or Carp::confess "Error from close(" . join(q{, }, @_) . "): $!";
}
my %dup; # cache this so STDIN stays fd0
my %proxy_count;
sub _proxy_std {
my %proxies;
if ( ! defined fileno STDIN ) {
$proxy_count{stdin}++;
if (defined $dup{stdin}) {
_open \*STDIN, "<&=" . fileno($dup{stdin});
# _debug( "# restored proxy STDIN as " . (defined fileno STDIN ? fileno STDIN : 'undef' ) . "\n" );
}
else {
_open \*STDIN, "<" . File::Spec->devnull;
# _debug( "# proxied STDIN as " . (defined fileno STDIN ? fileno STDIN : 'undef' ) . "\n" );
_open $dup{stdin} = IO::Handle->new, "<&=STDIN";
}
$proxies{stdin} = \*STDIN;
binmode(STDIN, ':utf8') if $] >= 5.008; ## no critic
}
if ( ! defined fileno STDOUT ) {
$proxy_count{stdout}++;
if (defined $dup{stdout}) {
_open \*STDOUT, ">&=" . fileno($dup{stdout});
# _debug( "# restored proxy STDOUT as " . (defined fileno STDOUT ? fileno STDOUT : 'undef' ) . "\n" );
}
else {
_open \*STDOUT, ">" . File::Spec->devnull;
# _debug( "# proxied STDOUT as " . (defined fileno STDOUT ? fileno STDOUT : 'undef' ) . "\n" );
_open $dup{stdout} = IO::Handle->new, ">&=STDOUT";
}
$proxies{stdout} = \*STDOUT;
binmode(STDOUT, ':utf8') if $] >= 5.008; ## no critic
}
if ( ! defined fileno STDERR ) {
$proxy_count{stderr}++;
if (defined $dup{stderr}) {
_open \*STDERR, ">&=" . fileno($dup{stderr});
# _debug( "# restored proxy STDERR as " . (defined fileno STDERR ? fileno STDERR : 'undef' ) . "\n" );
}
else {
_open \*STDERR, ">" . File::Spec->devnull;
# _debug( "# proxied STDERR as " . (defined fileno STDERR ? fileno STDERR : 'undef' ) . "\n" );
_open $dup{stderr} = IO::Handle->new, ">&=STDERR";
}
$proxies{stderr} = \*STDERR;
binmode(STDERR, ':utf8') if $] >= 5.008; ## no critic
}
return %proxies;
}
sub _unproxy {
my (%proxies) = @_;
t/lib/IO/String.pm view on Meta::CPAN
{
print "DESTROY @_\n" if $DEBUG;
}
sub close
{
my $self = shift;
delete *$self->{buf};
delete *$self->{pos};
delete *$self->{lno};
undef *$self if $] eq "5.008"; # workaround for some bug
return 1;
}
sub opened
{
my $self = shift;
return defined *$self->{buf};
}
sub binmode
t/lib/IO/String.pm view on Meta::CPAN
return 1 unless @_;
# XXX don't know much about layers yet :-(
return 0;
}
sub getc
{
my $self = shift;
my $buf;
return $buf if $self->read($buf, 1);
return undef;
}
sub ungetc
{
my $self = shift;
$self->setpos($self->getpos() - 1);
return 1;
}
sub eof
t/lib/IO/String.pm view on Meta::CPAN
else {
$$buf .= ($self->pad x ($len - length($$buf)));
}
return 1;
}
sub read
{
my $self = shift;
my $buf = *$self->{buf};
return undef unless $buf;
my $pos = *$self->{pos};
my $rem = length($$buf) - $pos;
my $len = $_[1];
$len = $rem if $len > $rem;
return undef if $len < 0;
if (@_ > 2) { # read offset
substr($_[0],$_[2]) = substr($$buf, $pos, $len);
}
else {
$_[0] = substr($$buf, $pos, $len);
}
*$self->{pos} += $len;
return $len;
}
t/lib/IO/String.pm view on Meta::CPAN
*syswrite = \&write;
sub stat
{
my $self = shift;
return unless $self->opened;
return 1 unless wantarray;
my $len = length ${*$self->{buf}};
return (
undef, undef, # dev, ino
0666, # filemode
1, # links
$>, # user id
$), # group id
undef, # device id
$len, # size
undef, # atime
undef, # mtime
undef, # ctime
512, # blksize
int(($len+511)/512) # blocks
);
}
sub FILENO {
return undef; # XXX perlfunc says this means the file is closed
}
sub blocking {
my $self = shift;
my $old = *$self->{blocking} || 0;
*$self->{blocking} = shift if @_;
return $old;
}
my $notmuch = sub { return };
# throw and catch an exception
my $die_msg = "your mom";
my ($got_val, $got_err);
my $stderr = capture_stderr {
$got_val = eval { die "$die_msg\n"; };
$got_err = $@;
};
# make sure die still worked
is $got_val, undef, "die didn't break";
# determine what should be output before the exception message
my $msg = $CLASS->_msg;
my $exp_output = <<END;
(â¯Â°â¡Â°ï¼â¯ï¸µ â»ââ» $msg
$die_msg
END
# make sure original exception was not changed
( run in 1.540 second using v1.01-cache-2.11-cpan-d80b1682f3f )