いいえ、#bindingOf:はメソッドのコンパイルに関連しています。
グローバル変数、クラス変数、プール変数など、いくつかのメソッドを介してアクセスできる変数は、メソッドリテラルに同じバインディングを格納することで共有されます。バインディングは、キーが変数名で値が変数値である一種の関連付けです。
コードで変数を使用する場合、メソッドは内部のバインディングに#valueを送信し、変数に値を格納すると、#valueを送信します。
ただし、Smalltalkのフレーバーによっては、これらの操作がバイトコードで最適化され、バインディングの2番目のインスタンス変数(値)への直接アクセスに置き換えられる場合があることに注意してください。
したがって、コンパイラは、共有変数にアクセスするために、bindingOf:aSymbolを取得する必要があります。ここで、aSymbolは変数の名前です。変数アクセスのスコープはクラスに依存するため、メソッドがコンパイルされるクラスはその情報について照会されます(クラスとそのサブクラスのみがクラス変数にアクセスできます...)。
YourClassでのインスタンス作成をオーバーライドする場合は、クラス側で#newをオーバーライドするだけです(YourClassクラス>> #newと言います)。Squeak / Pharo方言を使用する場合、ほとんどの場合、#newは#initializeを呼び出すため、インスタンス側(YourClass >>#initialize)で#initializeをオーバーライドすることで特定のインスタンス化を実現できます。
編集
ObjectTracerを使用してObjectAへの#newの送信をキャッチしたい場合は、次のことができます。
| theTrueObjectA |
theTrueObjectA := ObjectA.
[Smalltalk globals at: #ObjectA put: (ObjectTracer on: ObjectA).
"insert the code you want to test here"
ObjectA new]
ensure: [Smalltalk globals at: #ObjectA put: theTrueObjectA].
EDIT2の最後の文は次のように置き換えることができますensure: [ObjectA xxxUnTrace]
ただし、最新のsqueakデバッガーは煩わしく、それ自体がObjectTracerに多くのメッセージを送信して、他のデバッガーがポップする原因になります...最初に[設定]ウィンドウを開き、logDebuggerStackToFileを無効にする必要があります。
関連するメカニズムは、メッセージ#doesNotUnderstand:がメッセージを理解しないときにオブジェクトによって送信されることであることに注意してください。ObjectTracerは#doesNotUnderstand:をオーバーライドして、デバッガーをポップアップします。
ProtoObjectをサブクラス化して、独自の#doesNotUnderstand:処理をインストールできます(トランスクリプトやファイルに何かを書き込むようなものです)。
また、ObjectTracer #inheritsFrom:ProtoObjectおよびProtoObject自体#respondsTo:ProtoObject >>#doesNotUnderstandによってキャッチされない多くのメッセージに注意してください。
最後の注意:理解できるメッセージを示すために上記の#を使用しました。
編集3:考えられる解決策は、2つのインスタンス変数tracedObjectとmessageMappingを使用して新しい種類のObjectTracerを定義し、このインスタンスを作成することです。
MessageInterceptor class>>on: anObject interceptMessages: aDictionary
"Create an interceptor intercepting some messages sent to anObject.
aDictionary keys define message selectors that should be intercepted.
aDictionary values define block of code that should be evaluated in place.
These blocks always take one argument for passing the traced Object,
plus one argument per message parameter.
snip..."
MessageInterceptor>>doesNotUnderstand: aMessage
mapping := messageMapping at: aMessage selector
ifAbsent:
["We don't intercept this message, let the tracedObject handle it"
^aMessage sendTo: tracedObject].
^mapping valueWithArguments: {tracedObject} , aMessage arguments
たとえば、次のように使用します。
| interceptor |
interceptor := MessageInterceptor on: ObjectA interceptMessages:
({#new -> [:class | ObjectTracer on: class new]} as: Dictionary).
[Smalltalk globals at: #ObjectA put: interceptor.
"insert the code you want to test here"
ObjectA new yourself]
ensure: [interceptor xxxUnTrace].