謎な行為

最近、こんなコードを書きました。

名前空間わけて使いたいものを
モジュールとして定義しとく。

fuga/hoge_util.rb

module Fuga::HogeUtil
  def benri_method
    print "totemo benri!"
  end

  ...

end

使いたいクラスを書いとく。
ここでは、後で使うかもしれないモジュールを
Module#autoload(const, path)で定義しとく。

fuga.rb

class Fuga
  autoload :HogeUtil, 'fuga/hoge_util.rb'

  ...

end

実際に使う場面では、
インスタンスを生成したあとで
Object#extend Mod する。
事前に Module#autoload されているので
Mod が呼ばれたタイミングで Kernel#requireされる

use_case.rb

require 'fuga.rb'

fuga = Fuga.new
fuga.extend HogeUtil
fuga.benri_method #=> "totemo benri!"

実際やってみるとイチイチ Object#extend するのが
面倒だったりする。
最初から クラス定義の中で include Mod しておけばいいのかもしれないけど。
事前になんでも include されていると実際にクラスを使う場面になって、使いもしないモジュールが include されているのもなんだかなぁ…っていう気がしなくもない。


要約すると、個人的に Module#autoload が好きなんだけど。
なんかうまく活用する方法が見つからない。
……っていうことなんだけどね。