<!--
   $FML$
-->

<sect1 id="fml.command.overview">
	<title>
	コマンド処理の概要:
	『4.0 と 5.0 のコードの書き方はどのくらい違うか？』 
	</title>

<para>
コマンドの典型『ファイルを送り返す』だけの help コマンドを例にとり説明
しましょう。
</para>

<para>
5.0 では help ファイルを送り返すコードの実体は 
	FML::Command::User::help にあり、
	FML::Process::Command クラスから
	(FML::Command の AUTOLOAD を経由して)呼び出されます。
</para>

<warning>
<para>
	注意: 全てのコマンドは FML::Command::User::コマンド もしくは
	FML::Command::Admin::コマンド クラスとして実装されています。
	なお makefml は FML::Command::Admin::コマンド を使います。
</para>
</warning>

<para>
help の実体は FML::Command::User::help のこの関数です。
<screen>
sub process
{
    my ($self, $curproc, $optargs) = @_;
    my $config        = $curproc->{ config };
    my $charset       = $config->{ reply_message_charset };
    my $help_file     = $config->{ help_file };

    # template substitution: kanji code, $varname expansion et. al.
    my $params = {
        src         => $help_file,
        charset_out => $charset,
    };
    my $help_template = $curproc->prepare_file_to_return( $params ); 

    if (-f $help_template) {
        $curproc->reply_message( {
            type        => "text/plain; charset=$charset",
            path        => $help_template,
            filename    => "help",
            disposition => "help",
        });
    }
    else {
        croak("no help file ($help_template)\n");
    }
}
</screen>
ここで $curproc は UNIX カーネルでおなじみの current process 構造体へ
のポインタに相当するハッシュリファレンスです。
そして $config ハッシュとして蓄えられている設定変数空間は、4.0 ではグ
ローバル変数です。
</para>

<para>
prepare_file_to_return() はメッセージテンプレートの中にある変数の展開
や文字コード変換を適宜行ないます。
 </para>

<para> 
$curproc->reply_message() は引数によって振舞いがことなりますが、
いずれにせよ、メッセージをキューに入れるメソッドです。
</para>

<para>
キューに入れられたメッセージ群は、プロセスの終了直前に一通のメールとし
て組み立てなおされ、Mail::Delivery クラス経由で送信されます。メッセー
ジキューの種類がファイルとメッセージが混在していれば、適宜 MIME マルチ
パートのメッセージが生成されます。
</para>

<para>
この仕組みは fml 4.0 の Notify() と同様ですが、あらゆるメッセージがキュー
に入れられ、最後に一気に処理されるという点で大きく異なります。get コマ
ンドなども同じように扱われます。つまり 4.0 の Notify() 相当部分が(通常
の記事配送以外の)あらゆる送信機能を担当するということです。
この点において、送信のキューイングのメカニズムは大きく異なっています。
</para>

</sect1>
