Extremely poor design:
* Not DRY. What if I want to use a cache for production but disable caching in development? And I have 10s or even 100s of functions that rely on the cache? Because the decorators contain implementation/client-specific parameters, I now have to add another entire layer of abstraction over this.
* Implementation is tied to the decorator, e.g. `ring.memcache` -- seriously? Why does it matter?
* What about setting application defaults, such as an encoding scheme, a key prefix/namespace, a default timeout?
I'm sorry but this is over-engineered garbage and good luck to anyone who uses it.