def memoize(*method_names)
options = Hash === method_names.last ? method_names.pop : {}
options[:arguments] = true if options[:arguments].nil?
ref = options[:class] ? 'self.class.name' : 'self'
frz = options[:freeze] ? '.freeze' : ''
arg = options[:arguments] ? '[__a__, block_given?]' : 'nil'
code = ""
method_names.each do |m|
code << "alias_method '\#{ m }:memo', '\#{ m }'\nprivate '\#{ m }:memo'\ndef \#{ m }(*__a__,&__b__)\nc = Memoizable.cache[\#{ref}][:'\#{ m }']\nk = \#{arg}\nif c.has_key?(k)\nc[k]\nelse\nc[k] = __send__('\#{ m }:memo',*__a__,&__b__)\#{frz}\nend\nend\n"
end
module_eval(code)
end