メソッド未定義時のフック

わざと存在しないメソッドを使って、

1 foo: 2 bar: 3

をDo itしてみる。当然エラーになるので、デバッガのボタンを押す。
見ると最後は doesNotUnderstand: aMessage というメソッドが実行されていることがわかる。
ということは、これがrubyのmethod_missingに対応するのかな。
引数のaMessageがデバッガの右下欄に入っているので、これを選択すると以下のような値であることがわかる。

a Message with selector: #foo:bar: and arguments: #(2 3)

以上の結果をふまえてWIN32OLEクラスに以下の定義を追加する。

doesNotUnderstand: aMessage 
	aMessage arguments isEmpty 
		ifTrue:  [self getProperty: aMessage selector]
		ifFalse: [self invokeMethod: (aMessage selector copyUpTo: $:)
				withArguments: aMessage arguments]

これで、昨日の例では

ie invokeMethod: 'navigate' with: 'http://www.google.com/'

とやっていたところを以下のようにすることが出来る。

ie navigate: 'http://www.google.com/'

追記
ここに#doesNotUnderstand:や他の機能についてRubyとの対応表があった。

RubySmalltalk のリフレクション機能対応表

http://d.hatena.ne.jp/sumim/20050927/p1