Animal.new.say_moo => "moo" => Animal.new.say_moo("shout") => "MOO""> Animal.new.say_moo => "moo" => Animal.new.say_moo("shout") => "MOO""> Animal.new.say_moo => "moo" => Animal.new.say_moo("shout") => "MOO"">
class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say" && speak
      return speak.upcase if args.first == "shout"
      speak
    else
      super
    end
  end
end

=> Animal.new.say_moo
=> "moo" 
=> Animal.new.say_moo("shout")
=> "MOO"