Not as nice as Tim Hollingsworth's use of the method signature, but  
oh well.

-Brent

# Example Use

irb(main):001:0> include Friendly
=> Object
irb(main):002:0> foo = bar * z
It appears that bar is undefined.
Please define what I should do (end with a blankline):
12

It appears that z is undefined.
Please define what I should do (end with a blankline):
4

=> 48
irb(main):003:0> foo
=> 48
irb(main):004:0> bar
=> 12
irb(main):005:0> z
=> 4
irb(main):006:0> added_methods
=> [:z, :bar]
irb(main):007:0> puts added_method_definitions.join("\n\n")
def z
   4
end

def bar
   12
end
=> nil
irb(main):008:0>

# Solution

module Friendly

   def method_missing name
     @_new_methods ||= Hash.new
     unless @_new_methods.has_key? name
       prompt_for_definition name
     end
     eval @_new_methods[name]
   end

   def prompt_for_definition name
     puts "It appears that #{name} is undefined."
     puts "Please define what I should do (end with a blankline):"
     @_new_methods[name] = ""
     while $stdin.gets !~ /^\s*$/
       @_new_methods[name] << $_
     end
   end

   def added_methods
     @_new_methods.keys
   end

   def added_method_definitions
     @_new_methods.map {|k,v|
       s = "def #{k}\n  "
       v.rstrip!
       s << v.gsub("\n", "\n  ")
       s << "\nend"
     }
   end

end

--
http://brentfitzgerald.com/