永井@知能.九工大です.

From: SASADA Koichi <ko1 / atdot.net>
Subject: [ruby-dev:37982] Re: proposal: Module#method_adding
Date: Fri, 13 Feb 2009 05:52:57 +0900
Message-ID: <49948C70.7000403 / atdot.net>
> >  今,asakusa.rb で酒を飲んでたんですが,Module#method_adding とか,そう
> > いうメソッドというのはどうでしょうか. メソッドが定義される直前に呼ばれ
> > るメソッドです.
> > 
> > やりたいこと:
> >  例えば,foo というメソッドのオーバーライドをしたときに,old_foo のよう
> > な古いメソッドの alias を自動的に作るにはどうすれば,という話になりまし
> > た.Module#method_added を使うとどうだろう,と思ったのですが,これはすで
> > にメソッドを上書きした後でよばれるようです.
> > 
> >  ということで,メソッドを定義する直前にフックするためのメソッドとして
> > Module#method_adding というのを新設するのはどうだろう,という案がでまし
> > た.すでに,そういうことをする方法があればいいんですが,なければ,一つ検
> > 討ご検討いただけないでしょうか.
> > 
> 
>  なんとなく実装してみました.ちなみに,method_added の rdoc がなかった
> ので,singleton_method_added をコピーして適当に書きました.
> 
>  気づいた点は2点.
> 
> * ...ed 系のフックメソッドに,...ing 系を付け加えたくなってくる
>   結構きりがない.hook 関数全般を set_trace_func みたいにまとめる?
> 
> * singleton_*ed があるメソッドは *ed の rdoc がない.

method_added を method_added(symbol, pre_method_obj, new_method_obj) 
とするという考えはダメですかね?
そうすれば,define_method で旧い定義を別のメソッド名で定義したり,
適当に wrap して新旧織りまぜて呼び出すようにしたりとかが
自由に実装できそうに思います.
別名定義は自力でやるので,衝突チェックもその際にできるでしょう.

メソッドを書き換える前に呼ばれるか後に呼ばれるべきかによって,
pre_method_obj と new_method_obj とのいずれか一方は不要かもしれません.
Thread との絡みを考えると,メソッドを置き換えられてしまう前に
呼ばれるものが何かは欲しい気がしますね.
-- 
永井 秀利  (nagai / ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系