sub Value_eq { my ($target_value) = @_; sub { $_[0] eq $target_value ? 0 : undef } } sub Negative { sub { $_[0] < 0 ? 0 : undef } } #### package Base; multimethod new => (Value_eq('Base')) => sub {...} multimethod new => (Value_eq('Base'), Negative) => sub {...} multimethod new => (Value_eq('Base'), '#') => sub {...} package Der; use base 'Base'; multimethod new => (Value_eq('Der')) => sub {...} multimethod new => (Value_eq('Der'), '$') => sub {...} # etc. #### sub This::Class { my $target_value = caller; sub { $_[0] eq $target_value ? 0 : undef } } #### package Base; multimethod new => (This::Class) => sub {...} multimethod new => (This::Class, Negative) => sub {...} multimethod new => (This::Class, '#') => sub {...} package Der; use base 'Base'; multimethod new => (This::Class) => sub {...} multimethod new => (This::Class, '$') => sub {...} # etc.