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 Class::InsideOut ();

$|++; # keep stdout and stderr in order on Win32

plan tests => 9;

#--------------------------------------------------------------------------#

my $class    = "t::Object::Animal";
my $subclass = "t::Object::Animal::Antelope";

my ($o, $p);

#--------------------------------------------------------------------------#

require_ok( $class );
require_ok( $subclass );

ok( ($o = $class->new()) && $o->isa($class),
    "Creating a $class object"
);

ok( ($p = $subclass->new()) && $p->isa($subclass),
    "Creating a $subclass object"
);

is( $t::Object::Animal::animal_count, 2,
    "Count of animals is 2"
);

Class::InsideOut::_deregister( $p ) if $] < 5.006;
undef $p;
ok( ! defined $p,
    "Destroying the subclass object"
);

ok( ! scalar @t::Object::Animal::subclass_errors,
    "Subclass shouldn't inherit superclass DEMOLISH"
) or do {
    diag "  DEMOLISH improperly called by $_" 
        for @t::Object::Animal::subclass_errors;
};

Class::InsideOut::_deregister( $o ) if $] < 5.006;
undef $o;
ok( ! defined $o,
    "Destroying the first object"
);

is( $t::Object::Animal::animal_count, 1,
    "${class}::DEMOLISH decremented the count of animals to 1"
);