def translate(context, hash)
      # makes sure that the context is a hash
      raise ArgumentError.new('did not pass a hash for the context') unless context.is_a?(Hash)
      raise ArgumentError.new('cannot provide include hash in context') if context[:hash]
      # create the context instance for instance variables
      struct = StructContext.new(context, hash)

      # instantiate MapMethods to perform translations and define lambda
      # for how to tranlate a field
      #

      translate = lambda { |t|
        MapMethods.send(t[:name], struct, t[:field], t[:block])
      }

      # determine the version of the incoming hash
      #
      struct_version = struct.instance_exec(&@migrations.version)

      raise StandardError.new('calculated version is not valid') unless Gem::Version.correct?(struct_version)

      # gets a list of the potential versions 
      #
      migration_versions = @migrations.translations.keys
      migration_versions.delete(:first)
      migration_versions.delete(:last)

      # get the first and last translations
      #
      firsts = @migrations.translations[:first]
      lasts = @migrations.translations[:last]

      # sorts the versions
      #
      migration_versions.sort! do |x,y|
        Gem::Version.new(x) <=> Gem::Version.new(y)
      end

      # reverse order if descending was specified
      #
      migration_versions = @migrations.order == :descending ? migration_versions.reverse : migration_versions
      # run the first translations if they exist
      #
      firsts.each(&translate) if firsts

      # determine the first version to run translations
      #
      first_index = @migrations.order == :ascending ? migration_versions.find_index(struct_version) : nil
      last_index = @migrations.order == :descending ? migration_versions.find_index(struct_version) : nil

      # run all subsequent version translations
      #
      migration_versions.each_with_index do |version, index|
        next unless !first_index || index >= first_index
        next unless !last_index || index <= last_index
        @migrations.translations[version].each(&translate)
      end

      # run the first translations if they exist
      #
      lasts.each(&translate) if lasts

      # return hash
      #
      struct.hash
    end
def translate(context, hash)
      # makes sure that the context is a hash
      raise ArgumentError.new('did not pass a hash for the context') unless context.is_a?(Hash)
      raise ArgumentError.new('cannot provide include hash in context') if context[:hash]
      # create the context instance for instance variables
      struct = StructContext.new(context, hash)

      # instantiate MapMethods to perform translations and define lambda
      # for how to tranlate a field
      #

      translate = lambda { |t|
        MapMethods.send(t[:name], struct, t[:field], t[:block])
      }

      # determine the version of the incoming hash
      #
      struct_version = struct.instance_exec(&@migrations.version)

      raise StandardError.new('calculated version is not valid') unless Gem::Version.correct?(struct_version)

      # gets a list of the potential versions 
      #
      migration_versions = @migrations.translations.keys
      migration_versions.delete(:first)
      migration_versions.delete(:last)

      # get the first and last translations
      #
      firsts = @migrations.translations[:first]
      lasts = @migrations.translations[:last]

      # sorts the versions
      #
      migration_versions.sort! do |x,y|
        Gem::Version.new(x) <=> Gem::Version.new(y)
      end

      # reverse order if descending was specified
      #
      migration_versions = @migrations.order == :descending ? migration_versions.reverse : migration_versions
      # run the first translations if they exist
      #
      firsts.each(&translate) if firsts

      # determine the first version to run translations
      #
      first_index = @migrations.order == :ascending ? migration_versions.find_index(struct_version) : nil
      last_index = @migrations.order == :descending ? migration_versions.find_index(struct_version) : nil

      # run all subsequent version translations
      #
      migration_versions.each_with_index do |version, index|
        next unless !first_index || index >= first_index
        next unless !last_index || index <= last_index
        @migrations.translations[version].each(&translate)
      end

      # run the first translations if they exist
      #
      lasts.each(&translate) if lasts

      # return hash
      #
      struct.hash
    end
Generates the set of migrations by parsing the passed in block

 Translates a hash based on defined migrations
 with a given context and returns the hash.
 This will modify whatever gets passed in.