module_loaded_by ハンドラ
「 script "ModuleLoader"'s setup(me) 」によってライブラリがロードされた直後に、ライブラリの「 module_loaded_by 」ハンドラが呼ばれます。ライブラリが「 module_loaded_by 」ハンドラを実装することにより、ライブラリがロードされたタイミングでさまざまな処理を行うことができます。
- 依存ライブラリのロードが行われた後に呼ばれます。
- すなわち、「 "@module" 」コマンドが置かれた property へのライブラリの設定が行われた後に呼ばれます。
- 自分自身の初期化などの処理に利用できます。
- 「 module_loaded_by 」の返り値がロードされたライブラリになります。
- 「 me 」もしくは、なんらかのスクリプトオブジェクトを返す必要があります。
- 他のライブラリを継承したライブラリの生成に有用です。
- 追加でモジュールの読み込みを行えます。
- 「 module_loaded_by 」ハンドラの引数に与えられる loader スクリプトの load ハンドラを使ってください。
ロード時にライブラリの初期化
まずは、ライブラリがロードされたタイミングでライブラリの初期化を行うサンプルです。追加のライブラリの読み込みを行っており、動的にロードするライブラリを変えられます。
property MoreLib : missing value
property _value : missing value
on module_loaded_by(loader)
log "module_loaded_by"
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_by
on time_from_loaded()
return ((current date) - (my _value)) as text
end time_from_loaded
上のライブラリを読み込むトップレベルのスクリプトです。
property ModuleLoadedEvent : "@module"
script "ModuleLoader"'s setup(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_by 」ハンドラのもう一つの大きな用途は、他のライブラリを継承したライブラリを作ることです。
通常、スクリプトオブジェクトの parent はコンパイル時に決定されます。実行時に parent を決定するには、ハンドラの内部で、スクリプトオブジェクトを定義する必要があります。
次のサンプルは、ライブラリ「 SimpleTextLib 」を継承したスクリプトオブジェクト「 ExtendedTextLib 」を、module_loaded_by ハンドラ内で定義/生成し、それをライブラリとして扱います。
property name : "ExtendedTextLib"
use SimpleTextLib : script "SampleLibs/SimpleTextLib"
on module_loaded_by(loader)
log "module_loaded_by"
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_by
上のライブラリを読み込むトップレベルのスクリプトです。
property ExtendedTextLib : "@module"
script "ModuleLoader"'s setup(me)
tell ExtendedTextLib
remove_spaces("How now brown cow")
end tell