The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

use mop;

role Foo {}
role Bar {}
role Baz {}
role Bat with Baz {}

class Quux               with Foo, Bar {}
class Quuux extends Quux with Foo, Baz {}
class Xyzzy              with Foo, Bat {}

ok(Quux->DOES($_),  "... Quux DOES $_")  for qw( Foo Bar         Quux       mop::object UNIVERSAL );
ok(Quuux->DOES($_), "... Quuux DOES $_") for qw( Foo Bar Baz     Quux Quuux mop::object UNIVERSAL );
ok(Xyzzy->DOES($_), "... Xyzzy DOES $_") for qw( Foo     Baz Bat      Xyzzy mop::object UNIVERSAL );

ok(Quux->does($_),  "... Quux does $_")  for qw( Foo Bar         );
ok(Quuux->does($_), "... Quuux does $_") for qw( Foo Bar Baz     );
ok(Xyzzy->does($_), "... Xyzzy does $_") for qw( Foo     Baz Bat );

{ local $TODO = "broken in core perl" if $] < 5.019005;
push @UNIVERSAL::ISA, 'Blorg';
ok(Quux->DOES('Blorg'));
ok(Quuux->DOES('Blorg'));
ok(Xyzzy->DOES('Blorg'));
}

done_testing;