永続オブジェクトのクローンをメモリ中に置く作戦にしたとすると、そのクローンが生き残れるのはいつまでか?たぶん一番外側のトランザクションの内側だと思う。んでどうやってそれを実現すれば良いんだろ。とりあえず、トランザクションから抜けるときに、(一部を除き)メソッドをみんなundefして、メソッド呼び出しは全て永続オブジェクトの参照へ委譲するようにしてみた。たぶん、遅いだろうなあと思ったけどやっぱり遅い。
こういうのをあっさり解決するのはdRubyで環境を隠してしまうことだ。外部に出て行こうとする永続オブジェクトのクローンを参照に取り替えてしまうことができる。でも、dRubyは使いたくないんだよなー。dRubyを使うならファイルベースのOODBを書く必要がないというか、dRuby+ログスタイルで十分なわけだし。
あるオブジェクトのメソッド呼び出しをほとんど全てを、別のオブジェクトへ委譲するにはどんな風に書けば良いんだろう。今日はこんな風にしてみた。かっこわるい。
def _koya_leave_ ary = methods.find_all {|x| not ['__id__', '__send__', '_koya_ref_'].include?(x) } eval("class << self; undef_method(:#{ary.join(', :')}); def method_missing(m, *a, &b); @_koya_ref_.__send__(m, *a, &b); end; end") end
classのコンテキストにaryをうまく渡せなくてevalにしちゃった。