Rubyでプラグイン機構を作る

rack/rack · GitHub のコード読んでてプラグイン(Rackの場合はバックエンドにどのサーバを使うか)の処理があったので取り出して書いてみた.

Rubyではクラスは定数なのでHandlerっていう名前空間の中の定数を探すだけでいい.

# sample1.rb
module Handler
  class Base
    def call
      run
    end

    def run
      raise NotImplementedError
    end
  end

  class PlugA < Base
    def run
      p "called in A"
    end
  end
end

# sample2.rb
module Handler
  class PlugB < Base
    def run
      p "called in B"
    end
  end
end

# runner.rb
require_relative './sample1.rb'
require_relative './sample2.rb'

def run(class_name)
  klass = Handler.const_get(class_name)
  klass.new.call
end

['PlugA', 'PlugB'].each do |e|
  run e
end

# => "called in A"
# => "called in B"

githubの分割バージョンがある

github.com

感想

研究室にyogiboがあってそれに乗っかりながらだらだら読んでて、夏休みの朝に再放送のアニメ見てる感じだった