def cached(func):
    """ 
    DEPRECATED in favour of lru_cahce
    caches func return value
    """
    def cached_func(self, *args, **kwargs):
        # id(self) prevents sharing within subclasses
        attr = '_cached_%s_%i' % (func.__name__, id(self))
        key = (args, tuple(kwargs.items()))
        try:
            return getattr(self, attr)[key]
        except KeyError:
            value = func(self, *args, **kwargs)
            getattr(self, attr)[key] = value
        except AttributeError:
            value = func(self, *args, **kwargs)
            setattr(self, attr, {key: value})
        return value
    return cached_func