2008年 02月 01日

リロード可能なぷらぎん

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

今の方法

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

つけかえする方法

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