バージョン依存性を解決するための fml ブートローダ
fml 5.0 にはインストールされている fml のバージョン依存性を考慮するた
めに、実行時には本章で述べるようなブートストラップの過程があります。
boot していくイメージ
libexec/loader ->
FML::Process::Switch ->
FML::Process::Flow ->
FML::Process::それぞれのプログラムのモジュール
例: 配送の場合
loader から次々と呼ばれていく様子は、例えば配送処理の場合、次のよう
になる。
libexec/loader は FML::Process::Switch をロードし、
FML::Process::Distribute を実行すると決める。
FML::Process::Flow::ProcessStart() は引数として
FML::Process::Distribute を渡され、
FML::Process::Distribute を実行していく。
FML::Process:: クラスの階層構造
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 ... その他 ...
=>
FML::Process::それぞれのプログラムのモジュールについて
ブートしていく順番について
libexec/loader (wrapper)
Bootstrap() を実行する。
fml.pl などはこの loader へのシンボリックリンクです。
/usr/local/libexec/fml/ を参照して下さい。
/etc/fml/main.cf を読み込む。
読み込むと fml のバージョンが分かる。
default_config.cf はバージョン依存であるので、
ここでまずバージョンを評価しなければいけないことに注意。
( fml.pl を例にとると)
@ARGV を評価し、
どのMLの config.cf 群をロードすればいいのかを準備する。
変数の評価と展開には libexec/Standalone.pm を用います。
これはあまりよくないような気がします。
libexec/ を @INC に加えないといけないこと、
libexec/loader と libexec/Standalone.pm の2つが
入れ換えないといけないものになってしまうので。
次に
FML::Process::Switch
( バージョン依存 )ファイルを
ロードします。
Bootstrap2() および ProcessSwitch() を実行し、
配送用、コマンドモード用などの各
プログラム/プロセスなどへ制御を移します(分岐する)。
この時は $0 から自分の名前を知り、
どのプロセスへ分岐すればいいのかを判断しています。
(ポリモーフィズムの例)
モジュールをダイナミックバインディングし、
該当するプロセスオブジェクトを生成する。
そして、プロセスをスタートさせます。
FML::Process::Flow の中に、
どのように fml プロセスを実行するかが
定義されています。
$process = new FML::Process::なにか;
$process->prepare($args);
$process->run($args);
$process->finish($args);
のように実行されています。
各プロセスは、それぞれについて適当な関数を
用意してください。