Rubyで動的にクラスファイル(プラグイン)を読み込む  [ruby]  [sample_code]

いろいろな処理をするファイルをプラグインとして適当なディレクトリに入れておくと、それらをロードしてオブジェクト化するやりかた。
バッチ処理とかでカスタムな方法をインプリしたいときとかに使えるかと思う。

plugin_loader.rb


class PluginLoader
  attr_reader :plugins
  def initialize(plugin_base, extension = 'rb')
    @plugin_base = plugin_base
    @plugins = []
    Dir.glob(@plugin_base + "*.#{extension}").each do |p|
      require p
      @plugins << Object.const_get(to_classname(p)).new
    end
  end
  private
  def to_classname(str)
    str.sub(/^#{@plugin_base}/){""}.sub(/\.rb$/){""}.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
  end
end

使い方はこんな感じ(あらかじめpluginsディレクトリにxxxx.rbファイルを作っておく)

test.rb


require './plugin_loader' 

pl = PluginLoader.new(File.dirname(__FILE__) + "/plugins/")
pl.plugins.each do | p |
  p.run
end