The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More;
use ExtUtils::Manifest qw( maniread );

my $manifest = maniread();
my @files = grep m{^lib/.*\.p(od|m)$}, keys %$manifest;

my $i = 0;
for my $file (@files) {
    my($code, $line, @option) = extract_synopsis($file);
    unless ($code) {
        ok( 1, "No SYNOPSIS code" );
        next;
    }

    my $option = join(";", @option);
    my $test   = <<"TEST";
package
    Test::Synopsis::Sandbox$i;
use Test::More;
#line $line "$file"
$option;
ok 1, "$file";
$code;
done_testing;
TEST

    subtest $file => sub {
        eval($test);
        if($@) {
            if($@ =~ /Can't locate/) { # ' for poor editors
                pass "skipped: $@";
            }
            else {
                fail($@);
            }
            done_testing;
        }
    };
    $i++;
}

done_testing;

sub _compile {
    package
        Test::Synopsis::Sandbox;
    eval $_[0];    ## no critic
}

sub extract_synopsis {
    my $file = shift;

    my $content = do {
        local $/;
        open my $fh, "<", $file or die "$file: $!";
        <$fh>;
    };

    my $code = ( $content =~ m/^=head1\s+SYNOPSIS(.+?)^=head1/ms )[0];
    my $line = ( $` || '' ) =~ tr/\n/\n/;

    return $code, $line - 1,
      ( $content =~ m/^=for\s+test_synopsis\s+(.+?)^=/msg );
}