The Sinatra configuration capacity has always mystified me, but I think I've found the code I need to review to understand how its done.
First, look at the set method:
# Sets an option to the given value. If the value is a proc,
# the proc will be called every time the option is accessed.
def set(option, value=self, &block)
raise ArgumentError if block && value != self
value = block if block
if value.kind_of?(Proc)
metadef(option, &value)
metadef("#{option}?") { !!__send__(option) }
metadef("#{option}=") { |val| metadef(option, &Proc.new{val}) }
elsif value == self && option.respond_to?(:to_hash)
option.to_hash.each { |k,v| set(k, v) }
elsif respond_to?("#{option}=")
__send__ "#{option}=", value
else
set option, Proc.new{value}
end
self
end
Talk about rock and roll, OK? But wait, there's more. The metadef.
def metadef(message, &block)
(class << self; self; end).
send :define_method, message, &block
end
Do you think metadef sounds better than metameth?
