class BinData::SanitizedParameters

those parameters so they can be used by the BinData object.
A BinData object accepts arbitrary parameters. This class sanitizes

def [](param)

def [](param)
  @parameters[param]
end

def []=(param, value)

def []=(param, value)
  @parameters[param] = value unless @all_sanitized
end

def all_sanitized?

def all_sanitized?
  @all_sanitized
end

def delete(param)

def delete(param)
  @parameters.delete(param)
end

def ensure_mandatory_parameters_exist

def ensure_mandatory_parameters_exist
  @the_class.mandatory_parameters.each do |param|
    unless has_parameter?(param)
      raise ArgumentError,
              "parameter '#{param}' must be specified in #{@the_class}"
    end
  end
end

def ensure_mutual_exclusion_of_parameters

def ensure_mutual_exclusion_of_parameters
  return if length < 2
  @the_class.mutually_exclusive_parameters.each do |param1, param2|
    if has_parameter?(param1) and has_parameter?(param2)
      raise ArgumentError, "params '#{param1}' and '#{param2}' " +
                           "are mutually exclusive in #{@the_class}"
    end
  end
end

def ensure_no_nil_values

def ensure_no_nil_values
  @parameters.each do |param, value|
    if value.nil?
      raise ArgumentError,
            "parameter '#{param}' has nil value in #{@the_class}"
    end
  end
end

def has_parameter?(param)

def has_parameter?(param)
  @parameters.has_key?(param)
end

def initialize(params, the_class)

def initialize(params, the_class)
  @all_sanitized = false
  @the_class = the_class
  @parameters = {}
  params.each { |param, value| @parameters[param.to_sym] = value }
  ensure_no_nil_values
end

def length

def length
  @parameters.size
end

def merge_default_parameters!

def merge_default_parameters!
  @the_class.default_parameters.each do |param, value|
    self[param] ||= value
  end
end

def move_unknown_parameters_to(dest)

def move_unknown_parameters_to(dest)
  unless @all_sanitized
    unused_keys = @parameters.keys - @the_class.accepted_parameters.all
    unused_keys.each do |param|
      next if param == :onlyif
      dest[param] = @parameters.delete(param)
    end
  end
end

def needs_sanitizing?(param)

def needs_sanitizing?(param)
  has_parameter?(param) and not self[param].is_a?(SanitizedParameter)
end

def sanitize!(sanitizer)

def sanitize!(sanitizer)
  unless @all_sanitized
    merge_default_parameters!
    @the_class.sanitize_parameters!(self, sanitizer)
    ensure_mandatory_parameters_exist
    ensure_mutual_exclusion_of_parameters
    @all_sanitized = true
  end
end