堀之内と申します。

モジュールをネストして module_function を継承(のようなことを)
することはできるでしょうか。具体的には、モジュールに入れたアルゴ
リズム(メソッド群)を取り替えやすくするため、以下のようなことを
したいのですが、うまくいきません。使用しているのは ruby 1.6.8 で
す。同様のことをするのに別の方法があるよとか、1.6 ではだめだけど 
1.8 ならできるといった情報でも結構です。(まだしばらく1.6は切り
捨てたくないので困りはしますが。。。)

module Foo
  module_function
  def hi;  "hi";  end
  def there;  "there";   end
end
module Bar
  module_function
  extend Foo
  def hi;  'HI';  end
end

class Hoge
  @@algorithm = Foo
  def Hoge.set_algorithm(modul)
    @@algorithm = modul
  end
  def hi;  p @@algorithm::hi + '!';  end
  def there;  p @@algorithm::there + '!';  end
end

p Bar.private_instance_methods
a = Hoge.new
a.hi
a.there
Hoge.set_algorithm(Bar)
a.hi
a.there

ちょっと長くなりましたが、要するにデフォルトのアルゴリズム集
(Foo)があって、必要に応じてその一部を再定義した別のアルゴリズム
集(Bar)に取り替えたいということです。実際には、module Bar に相当
するものは、あらかじめ選択肢を用意するだけでなく、ユーザー定義な
ものがあることを想定しています。後から簡単に取り替えられるように
したいので、モジュールをインクルードする形にはしてません。

上記のプログラムを実行すると以下のようなエラーがでます。

% ruby nested_modules2.rb
["hi"]
"hi!"
"there!"
"HI!"
/.../nested_modules2.rb:18:in `there': private method `there' 
called for Bar:Module (NameError)
        from /.../nested_modules2.rb:27

プライベートメソッドというわりには、Bar.private_instance_methods
の結果に含まれない(上記の実行結果1行目)のが腑に落ちません。

なお、module Bar において extend でなく include にしてもだめです。

/.../nested_modules2.rb:18:in `there': undefined method `there' 
for Bar:Module (NameError)
        from /.../nested_modules2.rb:26

以上、よろしくお願い致します。