The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 5;
use MooseX::DeclareX plugins => [qw(abstract)];

class Primate is abstract
{
	requires 'classification';
	has 'name' => (is => 'ro', isa => 'Str');
}

class Monkey is concrete extends Primate
{
	has 'classification' => (is => 'ro', isa => 'Str');
}

try {
	class Human extends Primate;
}
catch {
	pass("can't inherit from abstract class without implementing required method");
}

my $bobo = Monkey::->new(name => 'Bobo');
is(
	$bobo->name,
	'Bobo',
	"can instantiate derived classes",
);

try {
	my $popo = Primate::->new;
}
catch ($e) {
	like($e, qr(^Primate is abstract), "can't instantiate abstract classes");
}

try {
	class Baboon is mutable extends Primate;
	pass("inherit from abstract class - mutable");
}

try {
	class Ape is abstract extends Primate;
	pass("inherit from abstract class - abstract");
}