$cb = new MT::Callback(name => <name>, code => sub { <callback code> });
<name>は人間が読解可能な文字列で、プラグイン名など、周囲のコードを識別するためのものです。ログを検証してエラーを特定するときに役立ちます。
コールバックの登録名を返します。
MT::Callbackオブジェクトを第1引数とし、invokeメソッドに渡されたすべての引数を2番目以降の引数として、コールバックを実行します。
コールバック・オブジェクトに関連付けられたプラグイン要素を返します。
各コールバック・ルーチンに渡されるパラメーターは、操作の種類によって変わります。詳細は次のとおりです。
load()とload_iter()は、データベースから項目を読み込む前に、<class>::pre_loadとして登録されたコールバックを呼び出します。このため、コールバック作成者は、データベースからの読み込み前に引数を処理することができます。次は<class>::pre_loadの記述例です。
sub pre_load { my ($eh, $args) = @_; ... }
load()または反復子から返される各オブジェクトは、返される前に、<class>::post_loadとして登録されているすべてのコールバックの処理を受けます。<class>::post_load関数の例は次のようなものです。
sub post_load { my ($eh, $args, $obj) = @_; ... }
$argsはメソッドに渡されたすべてのパラメーターを格納した配列へのリファレンスです。
次は、saveメソッドのコールバックの記述例です。
sub pre_save { my ($eh, $obj, $original) = @_; ... } sub post_save { my ($eh, $obj, $original) = @_; ... }
pre_save関数で$objを変更することにより、データベースに格納されるデータを制御することができます。オブジェクトに対して正反対の操作を行うようなpre_save()およびpost_load()関数を作成することにより、メモリー上のデータを通常の状態に保ちながら、特別な形でデータベースにデータを保存することができます。
<class>::pre_remove()および<class>::post_remove()メソッドは、対象となる操作の一番最初と一番最後に呼び出されます。コールバック・ルーチンは次のようにして呼び出します。
sub pre_remove { my ($eh, $obj) = @_; ... }
post_remove()メソッドの書式も同様です。<class>::pre_remove_all()および<class>::post_remove_all()メソッドは、対象となる操作の一番最初と一番最後に、MT::Callbackオブジェクト以外の引数なしで呼び出されます。
どのコールバック・ルーチンの場合も、第1引数はMT::Callbackオブジェクトです。このオブジェクトを使うことにより、エラーをMTに返すことができます。エラーの表示には、次のようにerror()を使うだけです。
sub my_callback { my ($eh, $arg2, $arg3) = @_; ... if (some_condition) { return $eh->error("The foofiddle was invalid."); } ... }