Rubyでプラグイン機能を実現するための自分なりの方法。
概要
入力があって、それをいじっていくタイプのプラグイン機構を作りたい。例えば、ruby
という入力があって、大文字にするプラグインと、2回繰り返すプラグインがあったら、RUBYRUBY
となる。
ディレクトリ構造
+--main.rb
+--plugins
| +--pluginA
| | +--plugin.rb
| +--pluginB
| | +--plugin.rb
プラグインを追加したい場合
例えば、大文字にするプラグイン(upcase)を追加したい場合
plugins/upcase/plugin.rb
class UpcasePlugin
def on_message(msg)
msg.upcase!
end
end
ソース
main.rb
plugins = []
Dir.entries('plugins').each do |name|
path = "plugins/#{name}"
next if File.ftype(path) != 'directory' or %w(. ..).include? name
require_relative path + '/plugin.rb'
name[0] = name[0].upcase
plugins << Module.const_get("#{name}Plugin").new
end
loop do
msg = gets.chomp!
plugins.each{|plugin| plugin.on_message(msg) }
puts msg
end
エラー処理皆無ですw。plugins内にあるディレクトリをプラグインとみなし、その中にあるplugin.rbをrequireすることでファイルをロードし、Module.const_get
でクラスを取得してnewしています。プラグインを使うときは、eachでぐるぐる回します。