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/