def customize(config = [])
m = Class.new(self)
supported_options = m.supported_options.inject({}) do |memo, opt|
memo[opt.name] = opt
memo
end
config.each do |option_config|
if config.kind_of?(Hash)
(name, value_desc) = option_config
else
(name, value_desc) = parse_option(option_config)
end
option = supported_options[name] || DefaultOption.new(name)
option = option.extend_with_config(*value_desc)
supported_options[option.name] = option
end
supported_ary = supported_options.values
MetaUtils.extend_method(m, :supported_options) { supported_ary }
supported_ruby_names = supported_ary.inject({}) do |memo, opt|
memo[opt.ruby_name] = opt
memo
end
MetaUtils.extend_method(m, :option) { |n| supported_ruby_names[n] }
supported_ary.each do |opt|
MetaUtils.extend_method(m, "validate_#{opt.ruby_name}") do |value|
opt.validate(value)
end
end
m
end