クラス拡張ミックスイン

メタプグラミングRubyの221ページにクラス拡張ミックスインというイディオムについての解説があったので写経してみた。
この『クラス拡張ミックスイン』は、モジュールをincludeした時にインスタンスメソッドとクラスメソッドを両方取り込みたい時に使うものらしい。

module Basicalbe
  def self.included(base)
    base.extend(ClassMethod)
  end

  def hai
    p("hello instance method")
  end

  module ClassMethod
    def hai
      p("hello class method")
    end
  end
end

class Hoge
  include Basicalbe
end

Hoge.new.hai # => "hello instance method"
Hoge.hai        # => "hello class method"

def self.included(base)

これはフックメソッド。
このフックメソッドは、フックメソッドが所属するモジュールがincludeされた時に実行する。
この例では、class Hoge内でincludeしているので、その時に実行される。
includedの仮引数は、includeされた時点でのselfとなるので、この場合ではHogeが格納されている。
そのままbase(Hoge)に対して、Basicable::ClassMethodをextendしている。

Rails4からはConcernsがあるので、自分でRailsモジュールを書く時にこのイディオムを使う機会はあまりないと思うけど
ライブラリを読む時にはこういう読み方を知らないと読めなさそうなので覚えておきたい。