I prefer to use define_method over method_missing when "metaprogramming". It allows you to explicitly define your "metamethods" up-front.<p>Using his example of the DoNotDisturb wrapper around InformationDesk, you could easily do something like:<p><pre><code> [:emergency, :flights, :local_transports, :hotels].each do |name|
define_method(name) do
check_lunch_break unless name == :emergency
@desk.send(name)
end
end
</code></pre>
Now you don't get the side effect of screwing up your exception handling and having to walk on eggshells with the rest of your coding in that class.<p>The other thing I like about this method is that it gets evaluated once, and then those methods exist. With method_missing, every single time you call one of those methods, it has to go all the way up the chain to find that method until it finally hits method_missing.<p>EDIT: Oh, and if nothing else, you can at least put the define_method inside the method_missing (I had a project that required method_missing once, so this is what I did). That way, it only has to crawl all the way up the inheritance chain once, then that method gets defined on your class, so subsequent calls to that method don't have to go all the way up the chain again.<p>Might not be much performance gain in Ruby, but when programming a rails app (where you're likely working on a class that inherits from ActiveRecord and 10 other classes), it helps.