fml のブートしていく様

fml のブートしていく様について

    イメージ

    libexec/loader -> FML::Process::Switch ->
                      FML::Process::Flow   ->
                      FML::Process::それぞれのプログラムのモジュール

=> FML::Process::それぞれのプログラムのモジュールについて

ブートしていく順番

- libexec/loader (wrapper)
  Bootstrap() を実行する。 fml.pl などはこの loader へのシンボリックリンクです。 /usr/local/libexec/fml/ を参照して下さい。
  - /etc/fml/main.cf を読み込む。 読み込むと fml のバージョンが分かる。 default_config.cf はバージョン依存であるので、 ここでまずバージョンを評価しなければいけないことに注意。
  - ( fml.pl を例にとると) @ARGV を評価し、 どのＭＬの config.cf 群をロードすればいいのかを準備する。 変数の評価と展開には libexec/Standalone.pm を用います。
    これはあまりよくないような気がします。 libexec/ を @INC に加えないといけないこと、 libexec/loader と libexec/Standalone.pm の２つが 入れ換えないといけないものになってしまうので。
  - 次に FML::Process::Switch ( バージョン依存 )ファイルを ロードします。
    - Bootstrap2() および ProcessSwitch() を実行し、 配送用、コマンドモード用などの各 プログラム/プロセスなどへ制御を移します(分岐する)。 この時は $0 から自分の名前を知り、 どのプロセスへ分岐すればいいのかを判断しています。
    - (ポリモーフィズムの例) モジュールをダイナミックバインディングし、 該当するプロセスオブジェクトを生成する。 そして、プロセスをスタートさせます。
      FML::Process::Flow の中に、 どのように fml プロセスを実行するかが 定義されています。

              $process = new FML::Process::なにか;
              $process->prepare($args);
              $process->run($args);
              $process->finish($args);

      のように実行されています。 各プロセスは、それぞれについて適当な関数を 用意してください。

  ○ loader から次々と呼ばれていく様子は、例えば配送処理の場合、次のよう になる。 libexec/loader は FML::Process::Switch をロードし、 FML::Process::Distribute を実行すると決める。 FML::Process::Flow::ProcessStart() は引数として FML::Process::Distribute を渡され、 FML::Process::Distribute を実行していく。

  ○ クラスの階層構造？

      FML::Process::Distribute >-|
      FML::Process::Command    >-|-- FML::Process::Kernel
      FML::Process::Mead       >-|    |
                                      |-use-a FML::Parse
                                      |-use-a FML::Config
                                      |-use-a FML::Log
                                      |-use-a  ... その他 ...