refactor snapshot, move existing snapshot code into its own snapshotstrategy