IRC BOT を作り直し。RICE 使うことにする。
プラグインのロード方法を変えた。新しい無名のモジュールを作ってその中で実行してクラスのインスタンスを得るようにする。そうすれば空間が汚れないし GC 的にも嬉しいっぽい。たぶん。
def load(klass_name) filename = klass2file(klass_name) mod = Module.new mod.module_eval(File.open("#{dir}/#{filename}") {|f| f.read}, filename) c = nil begin c = mod.const_get(klass_name) rescue NameError raise ClassNotFoundError.new("#{dir}/#{filename} must include #{klass_name} class") end # @klass (new に渡した上位クラス) を継承していなかったらエラー if c < @klass @plugins[klass_name] = { :instance => c.new, :loaded => Time.now, } else raise NotInheritAbstractClassError.new("The class #{klass_name} must inherit #{@klass}") end klass_name end
Abstract っていうのはなんか違う気がする。