Regarding (1), I am pretty sure it's not an issue. From looking at the code, `Version` is immutable so long as you don't do crazy things like `version.hash << "wtf"`. Incidentally you can see I changed `#version` to return a dup of the `@version` as not doing this did lead to a test failure.

Regarding (2), I agree that this is a problem in theory, although in practise I can't see a situation where any application will use an infinite number of different version objects. However, people do do unexpected things so I'm not averse to addressing this concern. I think the simplest thing to do would be to just make the cache bounded to a certain size. We'd have to do some research to find out what a good default for this would be but that would prevent the memory usage growing unbounded. Regarding your `VersionCache` proposal, I don't see how this would prevent the memory leak specifically? It seems more to do with how to structure the code?

Anyway, maybe we should just return to these when #435 is done, as that's certainly the lowest hanging fruit right now.