You can define multimethods with the "multi" declarator: use Class::Multimethods::Pure; multi collide => ('Bullet', 'Ship') => sub { my ($a, $b) = @_; ... }; multi collide => ('Ship', 'Asteroid') => sub { my ($a, $b) = @_; ... }; It is usually wise to put such declarations within a BEGIN block, so they behave more like Perl treats subs (you can call them without parentheses and you can use them before you define them). WWW: https://metacpan.org/release/Class-Multimethods-Pure