2008年 02月 01日

citrus, UriInformation の分離

いま mixi とか plagger の db から情報とってくるとかが一つのファイルにつっこまれてて非常にダサイので、どうにかする。たぶん UriInformation の中でさらに Plugins インスタンスをもつようになる。

plugins/uri_handlers/{mixi,plagger,image,ftp,http,urn,amazon}

これらは、実行順を持っていて、あるプラグインで処理が確定したら後続のプラグインは実行されない。


ということをやりたいけど眠くてしかたないのでねる……テストどうやってかこう。

リロード可能なぷらぎん

もっといい実装ないかなぁ……

今の方法

  • 匿名モジュールでロード
    • プラギンクラスは、そのファイルとしてはトップレベルの定義になる module::Foobar
  • グローバルな環境からこのクラスにアクセスには困難 (匿名モジュールなので
  • ロードする環境がいつも必ず別々になるのでリロードのときに問題がおこりにくい (とおもう)
  • プラギンがさらにプラギン機構をもとうとするとめんどい。(ベースクラスも匿名モジュール内に入るので、直接参照できず、class_eval とかでロードする必要がある)

つけかえする方法

  • グローバルな名前空間にロード
    • プラギンクラスは Plugin::Foobar みたいになる
  • どこからでもアクセスできる
  • インスタンス化のタイミングとか参照状況によってはリロードしても GC きかない可能性があるかも (デバッグむずい)
  • リロードするときは remove_const / const_set
  • 継承とか依存があるときはそれらもよみなおさないと前の参照がのこる