Q:

Mix-inしたモジュールの特異メソッドの呼び出し方

Ruby Silverに向けて勉強しているものです。
特異クラスについて勉強用にサンプルコードを作成していたのですが、
自身の理解の範疇を越えたので質問させてください。
Module Fooを作成して、Class Barにextendでミックスインしています。
foo1が特異メソッドで定義されるのは理解しているつもりなんですが、
foo2、foo3についてBarからどのように呼び出せばよいのか（もしくはできない）を
おしえていただけないでしょうか
よろしくお願いいたします。
module Foo
  def foo1
    puts "foofoo1"
  end

  def Foo.foo2
    puts "foofoo2"
  end

  class << self
    def foo3
      puts "foofoo3"
    end
  end

end

class Bar
  extend Foo
end

結果です。
head :030 > Bar.foo2
NoMethodError: undefined method `foo2' for Bar:Class
    from (irb):30
    from /home/anoguchi/.rvm/rubies/ruby-head/bin/irb:11:in `<main>'

head :031 > Bar.foo3
NoMethodError: undefined method `foo3' for Bar:Class
    from (irb):31
    from /home/anoguchi/.rvm/rubies/ruby-head/bin/irb:11:in `<main>'

A:

基本的にはBarでFooをextendしてもFooの特異メソッドは呼び出せない、が答えになるんですが、どうしても実現したければこんな方法もあります。
module Foo
  def self.extended(klass)
    klass.extend ClassMethods
  end

  def foo1
    puts "foofoo1"
  end

  module ClassMethods
    def foo2
      puts "foofoo2"
    end

    def foo3
      puts "foofoo3"
    end
  end
  extend ClassMethods
end

class Bar
  extend Foo
end

Bar.foo1
Bar.foo2
Bar.foo3
puts "*" * 10
Foo.foo2
Foo.foo3
Foo.foo1 # NoMethodError

上記コードの実行結果
foofoo1
foofoo2
foofoo3
**********
foofoo2
foofoo3
test.rb:34:in `<main>': undefined method `foo1' for Foo:Module (NoMethodError)

以上、ご参考までに。
参考文献

Rubyのモジュールメソッドの作り方

A:

Object#extendの機能は以下の説明のとおりです。

引数で指定したモジュールのインスタンスメソッドを self の特異 メソッドとして追加します。

http://docs.ruby-lang.org/ja/2.0.0/method/Object/i/extend.html
foo1はFooのインスタンスメソッドですが、foo2・foo3はFooの特異メソッドであってインスタンスメソッドでないのでextendの対象にはなりません。よって、foo2・foo3はBarには所属していないため、Bar.foo2のような呼び出しはできないことになります。

