<!--
   $FML: create.sgml,v 1.2 2003/04/15 14:51:42 fukachan Exp $
-->

<chapter id="module.create">
	<title>
	例題: 新しいプログラムを作る
	</title>


<para>
ここでは、単純なスケジュール表示ソフトを例にとり、&fmldevel; のフレー
ムワークの中で新しいプログラムを追加するにはどうすれば良いのかを説明し
ます。 以下、プログラム名は fmlsch とし、その CGI 版が fmlsch.cgi です。
</para>


<sect1>
	<title>
	ケーススタディ: fmlsch を作る。
	</title>


<sect2>
	<title>
	ステップ 1: インストーラに fmlsch を付け加える
	</title>

<para>
fml/bin/fmlsch.in シェルスクリプトを用意し、
fml/etc/install.cf.in の bin_programs 変数に fmlsch を追加します。
bin_programs にあるスクリプトはインストーラがインストールしてくれます。
</para>

<para>
fml/bin/fmlsch および fml/etc/install.cf の生成は
configure が行ないます。
configure.in に、この２つのファイルの変数展開をするように登録し、
autoconf を実行して configure を生成して下さい。
</para>

</sect2>


<sect2>
	<title>
	ステップ 2: モジュールを作る
	</title>


<para>
fmlsch の実体のモジュールとして、
fml/lib/FML/Demo/Calendar.pm を書きます。
</para>

<para>
また、必要な他にライブラリがあれば適宜輸入してください。
今回は CPAN から
HTML-CalendarMonthSimple-1.02.tar.gz
を輸入します。
</para>

<para>
Date-Calc も必要なので適宜インストールしてください。
</para>

</sect2>


<sect2>
	<title>
	ステップ 3: FML::Process:: を修正
	</title>

<para>
仕事のほとんどの部分は FML::Demo::Calendar が実行しますが、
&fmldevel; のブートローダから FML::Demo::Calendar を呼び出すために
FML::Process:: クラスを修正する必要があります。
</para>

<para>
まず、fmlsch プロセスの初期化から実行といった大まかな一連の手順を
fml/lib/FML/Process/Calender.pm 
に書きます。このファイルは新規に作成して下さい。
</para>

<para>
そして、ブートローダーへ fmlsch の場合は FML::Process::Calender を呼び
出せば良いことを教えるために
etc/modules
と
etc/command_line_options
に fmlsch のモジュール名との対応関係を追加します。
</para>


<para>
FML::Process::Calender は同じディレクトリのモジュールを適当にぱくって 
hack してください :-)

なお、fmlsch は機能が最小なので、FML::Process::Calender では
FML::Process::Calender::run() メソッドだけ用意すればおしまいです。

未定義の関数は FML::Process::Kernel のメソッドが使われます(継承)。
</para>

</sect2>

</sect1>


<sect1>
	<title>
	ケーススタディ: fmlsch.cgi
	</title>


<para>
改造の仕方はモジュールが FML::CGI:: クラスになる以外は fmlsch の場合と
同様です。FML::CGI::Calender は FML::Process::CGI のサブクラスです。
</para>

<para>
未定義のものについては FML::Process::CGI や FML::Process::Kernel がよ
きにはからいます。また、CGI.pm は FML::Process::CGI が使い、HTTP
header を生成しています。あくまでも最低限の処理なので
FML::CGI:: のモジュールで適宜 HTML の出力を補佐してあげます。 
</para>

</sect1>


</chapter>
