2016-08-04T18:23:15+09:00

ModuleLoader のマニュアルのドラフト - module loaded イベント

現在執筆中の ModuleLoader のマニュアルのドラフト第6弾です。AppleScript Libaries にはない、ModuleLoader 特有の機能の紹介です。module loaded イベントを利用すると、他のライブラリを継承したライブラリを作ることができます。

boot (module loader) for me 」によってライブラリがロードされた直後に、ライブラリには「 module loaded 」イベントが送られます。ライブラリで「 module loaded 」ハンドラを実装することにより、ライブラリがロードされたタイミングでさまざまな処理を行うことができます。

ライブラリの初期化

まずは、ライブラリがロードされたタイミングでライブラリの初期化を行うサンプルです。追加のライブラリの読み込みを行っており、動的にロードするライブラリを変えられます。

property MoreLib : missing value
property _value : missing value

on module loaded by loader
-- initialization of myself
set my _value to current date

-- load an additional library
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() -- result : 1
tell its MoreLib
log replace_text("How now brown cow", space, "-")
-- result : How-now-brown-cow
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")
-- result :"Hownowbrowncow"
end tell