Method missing (o Does not understand en Smalltalk) es un punto de intercepción en el method lookup que ofrecen algunos lenguajes para definir código a ejecutar si el objeto receptor no entiende el mensaje recibido. Si el method lookup falla, el objeto receptor recibirá el mensaje method_missing que en Object lanza un error por no entender el mensaje, pero qué pasa si redefinimos este mensaje?
Poder interceptar el method lookup de esta forma y redefinir lo que debería suceder en caso de que un objeto de la clase A no entienda el mensaje recibido es una herramienta muy poderosa ya que permite armar definiciones genéricas para cualquier mensaje (o para un amplio conjunto que nosotros estemos interesados).
Algunos ejemplos de uso:
Person.find_by(user_name: user_name, password: password)
Pero también se puede usar de la siguiente forma:
Person.find_by_user_name_and_password(user_name, password)
Supongamos que queremos hacer el method_missing para nuestro decorador, podría ser algo como:
def method_missing(symbol, *args, &block)
if @decorado.responds_to?(symbol)
@decorado.send(symbol, *args)
else
super
end
end
De esa forma si el objeto decorado entiende el mensaje, se lo mandará, de lo contrario ejecutará method_missing de la superclase.