class Coupdoeil::Hovercard::OptionsSet

def custom_animation? = options[:animation].to_s == "custom"

def custom_animation? = options[:animation].to_s == "custom"

def dup = OptionsSet.new(options.deep_dup)

def dup = OptionsSet.new(options.deep_dup)

def initialize(options = {})

def initialize(options = {})
  @options = options
end

def merge(options_set)

def merge(options_set)
  OptionsSet.new(@options.merge(options_set.options))
end

def preload? = options[:loading].to_s == "preload"

def preload? = options[:loading].to_s == "preload"

def to_base36

def to_base36
  @to_base36 ||= begin
    shift = 0
    ORDERED_OPTIONS.reverse.sum do |option|
      bits = option.into_bits(@options[option.key])
      result = bits << shift
      shift += option.bit_size
      result
    end.to_s(36).freeze
  end
end

def to_h = options

def to_h = options

def validate!

def validate!
  ORDERED_OPTIONS.map do |option|
    next unless @options.key?(option.key)
    value = @options[option.key]
    option.new(value).validate!
  end
  @options.assert_valid_keys(ORDERED_OPTIONS.map(&:key))
end