I'm not crazy about the names `DocGenCache` and `NoGenerationCache`—seems funny that `NoGenerationCache` would inherit from `DocGenCache`, but maybe that's only a superficial irony.

Are all of the methods on `DocGenCache` that aren't overridden still applicable to `NoGenerationCache`?

If increment were called `invalidate_all` for example, you'd expect it to raise a `NotImplementedError` or something on `NoGenerationCache` since it's not a supported operation. Depending on how much of the methods they share, perhaps it can be restructured so they both inherit from the same base class or something, but that might not be right. An example of weird behavior is that `NoGenerationCache` responds to `gen_caches`, but it will return all subclasses of `DocGenCache`!

Also it's right that `DocGenCache.gen_caches()` should **not** include subclasses of `NoGenerationCache`, right? (I think that's how __subclasses__ works so if so, seems like there's no problem.)