use MooseX::Declare; class Foo { has 'affe' => ( is => 'ro', isa => 'Str', ); method foo ($x) { $x } method inner { 23 } method bar ($moo) { "outer(${moo})-" . inner() } class ::Bar is mutable { method bar { blessed($_[0]) ? 0 : 1 } } class ::Baz { method baz {} } } role Role { requires 'required_thing'; method role_method {} } class Moo::Kooh { extends 'Foo'; around foo ($x) { $x + 1 } augment bar ($moo) { "inner(${moo})" } method kooh {} method required_thing {} with 'Role'; } class Corge extends Foo::Baz with Role { method corge {} method required_thing {} } class Quux extends Corge { has 'x' => ( is => 'ro', isa => 'Int', ); method quux {} } role SecondRole {} class MultiRole with Role with SecondRole { method required_thing {} } class MultiRole2 with (Role, SecondRole) { method required_thing {} } 1;