'Type the overloaded function by compiling the appropriate
implementation for the given args.'

def generic(self, args, kws):

    cache_key = (self.context, args, tuple(kws.items()))
    try:
        disp = self._impl_cache[cache_key]
    except KeyError:
        pyfunc = self._overload_func(*args, **kws)
        if (pyfunc is None):
            self._impl_cache[cache_key] = None
            return
        from numba import jit
        jitdecor = jit(nopython=True, **self._jit_options)
        disp = self._impl_cache[cache_key] = jitdecor(pyfunc)
    else:
        if (disp is None):
            return
    disp_type = types.Dispatcher(disp)
    sig = disp_type.get_call_type(self.context, args, kws)
    self._compiled_overloads[sig.args] = disp_type.get_overload(sig)
    return sig
