def levenshtein(s1, s2) a1 = (0..s2.length).to_a a2 = [] s1.chars.each_with_index do |ch1, i| a2[0] = i + 1 s2.chars.each_with_index do |ch2, j| cost = ch1 == ch2 ? 0 : 1 a2[j + 1] = [a2[j] + 1, a1[j + 1] + 1, a1[j] + cost].min end a1 = a2.dup end a1[s2.length] end class TypoBomb def get_stuff "My method is working as expected" end def method_missing(method_name, *args, &block) name = methods.select do |name| levenshtein(name.to_s, method_name.to_s) <= 2 end.first if !name.nil? val = send(name, *args, &block) self.class.undef_method(name) return val else raise NoMethodError end end end class InheritedBomb < TypoBomb def get_favorite_number 5 end end class CalculatorBomb < TypoBomb def add(x, y) x + y end def subtract(x, y) x - y end end