いまいです。

$ ruby -ve'
module M
  def self.append_features(klass)
    self.public_instance_methods(false).each do |name|
      method = self.instance_method(name)
      klass.__send__(:define_method, name, method)
    end
    super
  end

  def m1(a, b, c)
    [a, b, c]
  end

  def m2(*a)
    a
  end
end

p M.instance_method(:m1).arity
p M.instance_method(:m2).arity

class C
  include M
end

p C.public_instance_methods(false)
p C.instance_method(:m1).arity
p C.instance_method(:m2).arity

c = C.new
p c.m1(:a, :b, :c)
p c.m2(:a, :b, :c)
p c.m1(:a, :b)
'
ruby 1.8.3 (2005-06-23) [i386-linux]
3
-1
["m2", "m1"]
1 #<= ???
1 #<= ???
[:a, :b, :c]
[:a, :b, :c]
-e:34:in `m1': wrong number of arguments (2 for 3) (ArgumentError)
        from -e:34

のように、arity が必ず(?) 1 を返してしまうようです。呼び出しはふつうに
できますし、引数の数を間違えると、ちゃんと怒られます。何がしたいかとい
うと、XMLRPC::iPIMethods がクラスで定義されたメソッドしか公開してくれ
なくなった(<= 本来の動作です)ので、モジュールを include するタイミング
で強引に「クラスで定義されてること」にしてしまおう、というわけです。最
初に arity をチェックしてるみたいで、現状だと m2 にように * で受けて、
引数が一つの場合しかうまくいきません :-(。
--
Nobuhiro IMAI <nov / yo.rim.or.jp>
Key fingerprint = F39E D552 545D 7C64 D690  F644 5A15 746C BD8E 7106