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.