Versioning a contract is simple with a Registry contract which keeps a track of the current version the user is currently using and delegates to the contract accordingly.