<!--
   $FML: internal.sgml,v 1.5 2002/07/07 01:57:11 fukachan Exp $
-->

<sect1 id="fml.command.internal.change">
	<title>
	補足:
	『&fml4;と &fmldevel; のコードの書き方はどのくらい違うか？』
	</title>

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

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

<warning>
<para>
全てのコマンドは FML::Command::User::コマンドもしくは
FML::Command::Admin::コマンドクラスとして実装されています。なお 
makefml や CGI は FML::Command::Admin::コマンド を使います。コマンドメー
ルは User や Admin を権限に応じて適宜使い分けます。
</para>
</warning>

<para>
help コマンドの実体は FML::Command::User::help の process() 関数です。
<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 はハッシュリファレンスで、&fml4; の %Envelope におおむ
ね相当します。名前の通り、UNIX カーネルでおなじみの current process 構
造体へのポインタのようなもので、プロセスに関連するいろいろなデータ構造
やオブジェクトへのリファレンスを含んでいます。そして $config ハッシュ
として蓄えられている設定変数空間は、&fml4; ではグローバル変数です。
</para>

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

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

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

<para>
この仕組みは &fml4; の Notify() と同様ですが、あらゆるメッセージがキュー
に入れられ、最後に一気に処理されるという点で大きく異なります。
</para>

<para>
なお get コマンドなども同じキューイングの仕組みを使っています。つまり 
&fml4; の Notify() 相当部分が(通常の記事配送以外の)あらゆる送信機能を
担当するということです。この点において、送信のキューイングのメカニズム
は &fml4; と大きく異なっています。
</para>

</sect1>
