OBAQ構成定義ファイルからオブジェクトを生成できるクラスは次の3種類に分かれています。
モデルクラス
Obaq::ObaqModelObjをインクルードしたクラスです。
ユーザから対象システムの機能(What)を記述するクラスです。
ジョブクラス
Obaq::JobObjをインクルードしたクラスです。
モデルクラスに対して行う指示とその順番(How)を記述するクラス
コマンドセットクラス
Obaq::CommandSetを継承したクラスです。
モデルクラスとジョブクラスの組合せを決めて、
実際に行う作業を指定するために使用します。
構成定義ファイルの読みこみ
メインの構成定義ファイルを読みこみます。
この中から、%require等で指定されたRubyソースも読みこみその中でクラス定義が行なわれます。
そして、OBAQオブジェクトを生成します。
- build_modelの実行
全てのモデルオブジェクトに対して、build_modelメソッドを呼び出します。
- コマンドセットの選択
実行するコマンドセットを選択します。
- ジョブクラスの実行
選択したコマンドセットに属するジョブクラスのdoitというメソッドを順番に実行していきます。
上記の一連の処理は、Obaq::ObaqApp.main に記述してあります。
アプリケーションから、このメソッドを呼びだすこともできますが、
これを実行する obaq というコマンドも用意してあります。
下記の内容を $ obaq sample.obaq として実行したとします。
# (1)
%model_class HelloMsg {
def_option :message
}
# (2)
HelloMsg hello1
message="Hello, world"
# (3)
CommandSet
ObaqJob
.def doit {
hello = app.get_object(HelloMsg, "hello1")
puts hello.message
}
この時、以下のような順番で処理が実行されます。
class HelloMsgの定義(%model_class)
OBAQオブジェクトを生成するためのクラス定義が行なわれます。
この例では、%model_classによって構成定義ファイルの中にクラスを定義していますが、
クラスの内容が複雑になる場合には、別ファイルに記述して %requireで読みこみます。
HelloMsgオブジェクトの生成
HelloMsgクラスのオブジェクトが生成されます。
このクラスには messageというオプションスロットがありますが、
このオプションには"Hello, world"という文字列が設定されます。
コマンドセットオブジェクトとジョブオブジェクトの生成
CommandSetとObaqJobは、組み込みのコマンドセットとジョブクラスです。
簡単な処理ではこのように組み込みのクラスを使用しますが、
複雑な処理では、ジョブオブジェクトやコマンドセットオブジェクトも個別に記述します。
そして、このObaqJobオブジェクトに doit というメソッドを定義しています。
コマンドセットの選択
この構成定義にはコマンドセットがひとつしかないので、自動的にそれが選択されます。
複数のコマンドセットがある場合は、obaqコマンド --target xxx というオプションを与えて
実行すべきコマンドセットを指定します。
ジョブの実行
このコマンドセットにはジョブオブジェクトがひとつだけ付属していますので、
そのオブジェクトのdoitメソッドを実行します。
doitメソッドの内容は、構成定義ファイル内にインラインで記述されています。
モデルオブジェクトの機能を呼出す
doitの中から app.get_object(クラス名、オブジェクト名)で、HelloMsgオブジェクトを呼び出します。
そして、おのオブジェクトに出力すべきメッセージの内容を問合せます。
このようにジョブは実行に際して、モデルオブジェクトに指示したり、問い合わせたりして、
ユーザの指定した構成に従った処理を行います。