現在執筆中の ModuleLoader のマニュアルのドラフト第6弾です。AppleScript Libaries にはない、ModuleLoader 特有の機能の紹介です。module loaded イベントを利用すると、他のライブラリを継承したライブラリを作ることができます。
「 boot (module loader) for me 」によってライブラリがロードされた直後に、ライブラリには「 module loaded 」イベントが送られます。ライブラリで「 module loaded 」ハンドラを実装することにより、ライブラリがロードされたタイミングでさまざまな処理を行うことができます。
- 依存ライブラリのロードが行われた後に呼ばれます。
- すなわち、「 module 」コマンドが置かれた property へのライブラリの設定が行われた後に呼ばれます。
- 自分自身の初期化などの処理に利用できます。
- 「 module loaded 」の返り値がロードされたライブラリになります。
- 「 me 」もしくは、なんらかのスクリプトオブジェクトを返す必要があります。
- 追加でモジュールの読み込みを行えます。
- 「 module loaded 」イベントの 「 by 」パラメータに与えられる loader スクリプトの load ハンドラを使ってください。。
ライブラリの初期化
まずは、ライブラリがロードされたタイミングでライブラリの初期化を行うサンプルです。追加のライブラリの読み込みを行っており、動的にロードするライブラリを変えられます。
property MoreLib : missing value
property _value : missing value
on module loaded by loader
set my _value to current date
tell loader
try
set MoreLib to load("ExtendedTextLib")
on error
set MoreLib to load("SimpleTextLib")
end try
end tell
return me
end module loaded
on time_from_loaded()
return ((current date) - (my _value)) as text
end time_from_loaded
上のライブラリを読み込むトップレベルのスクリプトです。
property ModuleLoadedEvent : module
boot (module loader) for me
delay 1
tell ModuleLoadedEvent
log time_from_loaded()
tell its MoreLib
log replace_text("How now brown cow", space, "-")
end tell
end tell
他のライブラリを継承したライブラリ
「 module loaded 」イベントのもう一つの大きな用途は、他のライブラリを継承したライブラリを作ることです。
通常、スクリプトオブジェクトの parent はコンパイル時に決定されます。実行時に parent を決定するには、ハンドラの内部で、スクリプトオブジェクトを定義する必要があります。
次のサンプルは、ライブラリ「 SimpleTextLib 」を継承したスクリプトオブジェクト ExtendedTextLib を、module loaded ハンドラないで定義/生成し、それをライブラリとして扱います。
property SimpleTextLib : module
on module loaded by loader
script ExtendedTextLib
property parent : SimpleTextLib
on remove_spaces(a_text)
return my replace_text(a_text, space, "")
end remove_spaces
end script
return ExtendedTextLib
end module loaded
上のライブラリを読み込むトップレベルのスクリプトです。
property ExtendedTextLib : module
boot (module loader) for me
tell ExtendedTextLib
remove_spaces("How now brown cow")
end tell