Reflection Ruby

class Fixnum
  def method_missing(m, *args)
    if args.size > 0
      raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)")
    end
    match = /^plus_([0-9]+)$/.match(m.to_s)
    if match
      self + match.captures[0].to_i
    else
      raise NoMethodError.
    new("undefined method '#{m}' for #{inspect}:#{self.class}")
    end
  end
end
4.plus_5                                          # => 9
10.plus_0                                         # => 10
-1.plus_2                                         # => 1
100.plus_10000                                    # => 10100
20.send(:plus_25)                                 # => 45
100.minus_3
# NoMethodError: undefined method 'minus_3' for 100:Fixnum
100.plus_5(105)
# ArgumentError: wrong number of arguments (1 for 0)