Engine, Applicationはクラスメソッドの呼び出しに失敗した場合は、インスタンスメソッドを実行する

railsアプリのconfig.ruを見ると"run XXX::Application"となっていて、でもRails::Applicationにはcall(env)がなくてってので、どうして動くのか理解できませんでしたが、ソースコードを見ると

 class Railtie
    autoload :Configurable,  "rails/railtie/configurable"
    ...
    class << self
      def inherited(base)
        unless base.abstract_railtie?
          base.send(:include, Railtie::Configurable)
          ...
        end
      end
     ...

となっていて、ようするにXXX::ApplicationはConfigurableをincludeしています。Configurableはだいたい次のコードのConfigurableをextendしたような効果があります。それで、rackがXXX::Application.call(env)しても動いてくれるのです。

最後にちょっと言語の知識をメモを。「rubyはメソッドが見つからないとき、method_missingを呼ぶきまりになっている」ようです。