"""

Functions:
memoize    Create a memoized version of a function.

"""
# Very simple, args must be hashable, and can take no keywords (not
# hashable)


MEMOIZE_MAGIC = "*"*20 + "MEMOIZE_MAGIC_NUMBER" + "*"*20

class memoize:
    def __init__(self, fn, cache=None, args2key=None):
        self._fn = fn
        self._cache = {}
        if cache is not None:
            self._cache = cache
        self._args2key = args2key
        self.__doc__ = fn.__doc__

    def __call__(self, *args):
        if self._args2key:
            key = self._args2key(*args)
        else:
            key = args
        if self._cache.has_key(key):
            retval = self._cache[key]
        else:
            retval = self._fn(*args)
            self._cache[key] = retval
        return retval
##        retval = self._cache.get(key, MEMOIZE_MAGIC)
##        if retval == MEMOIZE_MAGIC:
##            retval = self._fn(*args)
##            self._cache[key] = retval
##        return retval
