1# Derrived from https://metacpan.org/pod/Moose::Role 2 3package Eq; 4use Moose::Role; # automatically turns on strict and warnings 5 6requires 'equal'; 7 8sub no_equal { 9 my ($self, $other) = @_; 10 !$self->equal($other); 11} 12 13package R0; 14use Moose::Role; 15 16package R1; 17use Moose::Role; 18 19package R2; 20use Moose::Role; 21 22package C0; 23use Moose; 24 25package C1; 26use Moose; 27 28package C2; 29use Moose; 30 31# ... then in your classes 32 33package Currency; 34use Moose; # automatically turns on strict and warnings 35 36extends 'C1'; 37with 'Eq'; 38extends 'C2', 39 'C3'; 40with 'R0'; 41with 'R1', 'R2'; 42 43sub equal { 44} 45