module Kramdown::Options

def self.defaults

Return a Hash with the default values for all options.
def self.defaults
  temp = {}
  @options.each {|n, o| temp[o.name] = o.default}
  temp
end

def self.define(name, type, default, desc)

option will be opaque!
The type 'Object' should only be used if none of the other types suffices because such an

Symbol, Boolean, Array, Object), default value +default+ and the description +desc+.
Define a new option called +name+ (a Symbol) with the given +type+ (String, Integer, Float,
def self.define(name, type, default, desc)
  raise ArgumentError, "Option name #{name} is already used" if @options.has_key?(name)
  raise ArgumentError, "Invalid option type #{type} specified" if !ALLOWED_TYPES.include?(type)
  raise ArgumentError, "Invalid type for default value" if !(type === default) && !default.nil?
  @options[name] = Definition.new(name, type, default, desc)
end

def self.defined?(name)

Return +true+ if an option +name+ is defined.
def self.defined?(name)
  @options.has_key?(name)
end

def self.definitions

Return all option definitions.
def self.definitions
  @options
end

def self.merge(hash)

Merge the #defaults Hash with the parsed options from the given Hash.
def self.merge(hash)
  temp = defaults
  hash.each do |k,v|
    next unless @options.has_key?(k)
    temp[k] = parse(k, v)
  end
  temp
end

def self.parse(name, data)

String and then to the correct type.
If +data+ already has the correct type, it is just returned. Otherwise it is converted to a

value with the correct type.
Parse the given value +data+ as if it was a value for the option +name+ and return the parsed
def self.parse(name, data)
  raise ArgumentError, "No option named #{name} defined" if !@options.has_key?(name)
  return data if @options[name].type === data
  data = data.to_s
  if @options[name].type == String
    data
  elsif @options[name].type == Integer
    Integer(data)
  elsif @options[name].type == Float
    Float(data)
  elsif @options[name].type == Symbol
    (data.strip.empty? ? nil : data.to_sym)
  elsif @options[name].type == Boolean
    data.downcase.strip != 'false' && !data.empty?
  elsif @options[name].type == Array
    data.split(/\s+/)
  end
end