use MooseX::Declare; role DoesNegated { method negated { $self->new( x => -$self->x, y => -$self->y ) } } role DoesTranspose { method transpose { $self->new( x => $self->y, y => $self->x ) } } class Point with DoesNegated with DoesTranspose { has x => ( isa => 'Int', is => 'rw' ); has y => ( isa => 'Int', is => 'rw' ); method inspect { say $self->x . ' @ ' . $self->y } }