registry = {}


class MultiMethod(object):

    def __init__(self, name):
        self.name = name
self.typemap = {}

def __call__(self, *args):
    types = tuple(arg.__class__ for arg in args)
function = self.typemap.get(types)
if function is None:
    raise TypeError('no match')
return function(*args)

def register(self, types, function):
    if types in self.typemap:
        raise TypeError('duplicate registration')
self.typemap[types] = function

def multimethod(*types):

    def register(function):
        function = getattr(function, '__lastreg__', function)
name = function.__name__
mm = registry.get(name)
if mm is None:
    mm = registry[name] = MultiMethod(name)
mm.register(types, function)
mm.__lastreg__ = function
return mm
return register
if hasattr(function, '__lastreg__'):
    function = function.__lastreg__
Force a function parameter type in Python?