<!-- -*- mode:text coding:euc-jp -*-
   $FML: create.sgml,v 1.4 2008/08/19 03:16:57 fukachan Exp $
-->

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


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

<para>
なお、&fml8; ＋サードパーティ拡張として出荷するソフトウエアでは、
3rdparty/ 以下に同様の配置でファイルを生成し、
<footnote>

<para>
とはいえ、さすがに設定ファイルは、
さすがに fml リポジトリ以下の設定を変更する必要がありますね。
「追加で済むもの」
であればサードパーティ以下にスクリプトを作ればすむかと…
</para>

<para>
たぶん、そういった場合は、
サードパーティ以下に fml リポジトリ以下を参考に、
インストーラを一式作るほうが楽でしょう。
</para>

<para>
それでも、トップディレクトリの Makefile と configure の変更は必要ですなぁ。
</para>

</footnote>
インストーラ等の設定ファイルを変更して下さい。
</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 にあるスクリプトはインストーラが 
$prefix/bin/ へインストールする対象です。
</para>

<para>
fml/bin/fmlsch および fml/etc/install.cf の生成は
configure (GNU 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 が実行しますが、
&fml8; のブートローダから FML::Demo::Calendar を呼び出すために
FML::Process::Calender クラスを作成します。
</para>

<caution>
<para>
クラスの階層は fml/etc/modules の設定次第なので、
FML::Process::Calender である必要はなく、
どの階層でも(もちろん FML:: 以外でも)かまいません。
</para>
</caution>

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

<para>
そして、ブートローダーへ fmlsch プログラムが起動された場合には
FML::Process::Calender を呼び出すことを教えるために
fml/etc/modules ファイル
と
fml/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 
がよきにはからいます。
</para>

<para>
また、HTML 言語のほとんどは FML::Process::CGI が 
Perl デフォルトの CGI.pm を使っています。
HTTP header などの生成も CGI.pm モジュールです。
これらは、あくまでも最低限の処理なので
FML::CGI:: 以下のモジュール群が適宜 HTML の出力を補正しています。 
</para>

</sect1>


</chapter>
