implement first pass at versionable