class Temple::OptionHash

def []=(key, value)

def []=(key, value)
  validate_key!(key)
  super
end

def add_deprecated_keys(*keys)

def add_deprecated_keys(*keys)
  keys.flatten.each { |key| @valid[key] = @deprecated[key] = true }
end

def add_valid_keys(*keys)

def add_valid_keys(*keys)
  keys.flatten.each { |key| @valid[key] = true }
end

def deprecated_key?(key)

def deprecated_key?(key)
  @deprecated.include?(key) ||
    @hash.any? {|h| h.deprecated_key?(key) if h.respond_to?(:deprecated_key?) }
end

def initialize(*hash, &block)

def initialize(*hash, &block)
  super(*hash)
  @handler = block
  @valid = {}
  @deprecated = {}
end

def update(hash)

def update(hash)
  validate_hash!(hash)
  super
end

def valid_key?(key)

def valid_key?(key)
  include?(key) || @valid.include?(key) ||
    @hash.any? {|h| h.valid_key?(key) if h.respond_to?(:valid_key?) }
end

def valid_keys

def valid_keys
  (keys + @valid.keys +
   @hash.map {|h| h.valid_keys if h.respond_to?(:valid_keys) }.compact.flatten).uniq
end

def validate_hash!(hash)

def validate_hash!(hash)
  hash.to_hash.keys.each {|key| validate_key!(key) }
end

def validate_key!(key)

def validate_key!(key)
  @handler.call(self, key, true) if deprecated_key?(key)
  @handler.call(self, key, false) unless valid_key?(key)
end