プラグインを扱うコードを書く為に、Rubyで動的にクラスをロードする方法を適当に調べてみた[1][2]。
以下の方法があるっぽい。
- const_get
- eval
- qualified_const_get
どれ使えばいいのかイマイチわからん。
そもそもプラグイン的なものを作る場合にいちいちプラグイン側のクラス名気にする必要ないかも。
むしろプラグイン側で勝手にnewしてインスタンス突っ込んでくれるような感じでいいかも。
こんな感じで。どうっすかね。
class Plugin
def Plugin.load(path)
plugin = new()
plugin.instance_eval File.read(path)
plugin
end
def get_instance
@instance
end
end
#以下は読み込むファイル名をハードコードしているが、
#実際は[1]のコードみたいに特定のディレクトリにあるrubyのファイルをロードする
p = Plugin.load("myplugin.rb")
#プラグインを使う側はプラグインに要求するメソッドしか呼び出さない
p.get_instance().execute()
module MyModule
class MyPlugin
#プラグインに要求されるメソッドを実装しておく
def execute()
puts "hello world!!!"
end
end
end
@instance = MyModule::MyPlugin.new
###追記
i18nさんのアドバイスを元に最終的に上記とは違う形ですが簡単にPlugin化するためのモジュールを作りました。
gemとして公開したのでもしよければ使ってみて下さい。
https://rubygems.org/gems/pluggable_lite
https://github.com/nyamage/PluggableLite
###参考URL
[1]Rubyで動的にクラスファイル(プラグイン)を読み込む
http://motivation.drivendevelopment.jp/2009-11-16-1.html
[2]Loading classes from strings in Ruby
http://blog.sidu.in/2008/02/loading-classes-from-strings-in-ruby.html#.U8-tSYB_ux8
あなたの Ruby コードを添削します 【第 4 回】 Tropy
http://magazine.rubyist.net/?0015-CodeReview