use MooseX::Declare;
use Test::More tests => 9;
class Foo {
use Carp 'croak';
}
class Bar is dirty {
use Carp 'croak';
}
class Baz is clean {
use Carp 'croak';
}
my $clean_has_warned;
BEGIN {
$SIG{__WARN__} = sub {
my ($message) = @_;
if ($message =~ /Attempted to clean an already cleaned namespace/i) {
$clean_has_warned = $message;
return;
}
warn $message;
};
}
class Qux {
use Carp 'croak';
clean;
}
my $clean_has_not_warned;
BEGIN {
$clean_has_not_warned = 1;
$SIG{__WARN__} = sub {
my ($message) = @_;
if ($message =~ /Attempted to clean an already cleaned namespace/i) {
$clean_has_warned = 0;
return;
}
warn $message;
};
}
class Quux is dirty {
use Carp 'croak';
clean;
}
undef $SIG{__WARN__};
ok(!Foo->can('croak'), '... Foo is clean');
ok( Bar->can('croak'), '... Bar is dirty');
ok(!Baz->can('croak'), '... Baz is clean');
ok(!Qux->can('croak'), '... Qux is clean');
ok($clean_has_warned, 'Qux usage of clean and autoclean leads to warning');
like($clean_has_warned, qr/is dirty/, 'warning contains "is dirty" hint');
like($clean_has_warned, qr/Qux/, 'warning contains Qux namespace');
ok(!Quux->can('croak'), '... Quux is clean');
ok($clean_has_not_warned, 'Quux usage of clean in a dirty class leads to no warning');