The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;

my @modules;

sub find_modules {
    my $thing = shift;
    if (-d $thing && $thing !~ /^\./) {
        opendir(my $dh, $thing) or die $!;
        while (my $subthing = readdir($dh)) {
            find_modules($thing . '/' . $subthing) unless ($subthing =~ /^\./);
        }
        closedir $dh or die $!
    } else {
        if ($thing =~ /\.pm/) {
            push @modules, $thing;
        }
    }
}

find_modules('lib');

BAIL_OUT "No modules found" unless @modules;

my @dirties;

for my $module (@modules) {
    my $is_using_moose;
    my $has_cleaned_up;
    open(my $mod_h, '<', $module) or die $!;
    while (<$mod_h>) {
        $is_using_moose++ if /^use Moose;/;
        $has_cleaned_up++ if /->meta->make_immutable/;
    }
    close $mod_h or die $!;
    if($is_using_moose and not $has_cleaned_up) {
        push @dirties, $module;
    }
}

is(scalar(@dirties), 0, "There are no dirty modules")
    or diag(sprintf("%d of %d modules are dirty. Dirty modules are:\n\t", $#dirties + 1, $#modules + 1),
            join("\n\t", @dirties));

done_testing;