def def_fizzBuzz(sel, n)
  Integer.class_eval{
    define_method(sel){
      (m = self) % n == 0 ?
        sel.to_s.capitalize.instance_eval{ @x = m; self} :
        self
    }
  }
  String.class_eval{
    define_method(sel){
      (m = self.instance_eval{ @x }) % n == 0 ?
        (self+sel.to_s.capitalize).instance_eval{ @x = m; self} :
        self
    }
  }
end

def_fizzBuzz :fizz, 3
def_fizzBuzz :buzz, 5
def_fizzBuzz :gizz, 7

p 1.fizz.buzz #=> 1
p 3.fizz.buzz #=> "Fizz"
p 5.fizz.buzz #=> "Buzz"
p 15.fizz.buzz #=> "FizzBuzz"
p 7.fizz.buzz.gizz #=> "Gizz"
p 21.fizz.buzz.gizz #=> "FizzGizz"
p 35.fizz.buzz.gizz #=> "BuzzGizz"
p 105.fizz.buzz.gizz #=> "FizzBuzzGizz"
p 105.fizz.gizz.buzz #=> "FizzGizzBuzz"
p 999.fizz.buzz #=> "Fizz"

p 1.fizz.buzz + 2 #=> 3
p (1.fizz.buzz + 2.buzz).fizz #=> "Fizz"
p 15.fizz.buzz.gizz + "XXX" #=> "FizzBuzzXXX"