$self->{m}->($self,@args);
####
package foo;
# dispatch table
my %m_implementation_for;
# wrapper
sub m {
my ($self, @args) = @_;
my $implementation = $m_implementation_for{$self};
$implementation->($self, @args);
}
####
sub m {
my ($self, @args) = @_;
$m_implementation_for{$self}($self, @args);
}
####
my %m_closure_for;
# after the implementations have been defined
foreach my $object (keys %m_implementation_for) {
$m_closure_for{$object} = sub {
$m_implementation_for{$object}($object, @_);
};
}
# terser wrapper
sub m {
my ($self, @args) = @_;
$m_closure_for{$self}(@args);
}