The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package t::lib::capture;
use strict;
use warnings;

use File::Temp qw(tempfile);
use IPC::Open3;
use File::Spec;
use base qw(Exporter);

our @EXPORT = qw(capture *CAPTURE_OPTS);

our @CAPTURE_OPTS;
my @PERL5OPTS = map "-I$_", @INC;

sub capture ($) {
    my ($code) = @_;

    my ($fh, $filename) = tempfile()
      or die "can't open temp file: $!";
    print { $fh } $code;
    close $fh;

    open my $in, '<', File::Spec->devnull or die "can't open null: $!";
    open3( $in, my $out, undef, $^X, @PERL5OPTS, @CAPTURE_OPTS, $filename)
      or die "Couldn't open subprocess: $!\n";
    my $output = do { local $/; <$out> };
    close $in;
    close $out;

    $output =~ s/\r\n?/\n/g;

    unlink $filename
      or die "Couldn't unlink $filename: $!\n";

    return $output;
}

1;