2012-07-07T10:45:44+09:00

AppleScript のスクリプトオブジェクトにハンドラが実装されているか調べる

AppleScript のスクリプトオブジェクトであるハンドラが実装されているかどうかを調べて、処理を分岐させたいことがある。そこで、スクリプトオブジェクトであるハンドラが実装されている調べる適切な方法を検討してみた。

まず、安直に思いつくのは、ハンドラが実行してエラーが起きるかどうかを調べる。

script A
end script

try
A's hello()
log "implemented"
on error
log "not implemented"
end try

でもこの方法だと、ハンドラの実行途中に起きたエラーと区別がつかない。ハンドラの実装の有無を調べるという仕様になっていない。

そこで、次のような方法を考えてみた。

まず、スクリプトオブジェクトにプロパティにアクセスするのと同じようにハンドラにアクセスする。実は、スクリプトオブジェクトにとってハンドラとプロパティには区別が無い。プロパティにハンドラオブジェクトが代入された物を呼び出して使っているだけなんだ。

したがって、目的のハンドラが実装されていれば、ハンドラオブジェクトが返ってくる。でも、それはプロパティとして設定された値かもしれない。返ってきた値の class を調べて、hanlder class であれば、めでたくそのハンドラが実装されていると判断できる。

script A
on hello()
end hello
end script

script has_hello
try
return A's hello's class is handler
end try
return false
end script

if run has_hello then
log "'hello' is implemented"
else
log "'hello' is not implemented"
end if