メソッド未定義時のフック
わざと存在しないメソッドを使って、
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との対応表があった。
Ruby と Smalltalk のリフレクション機能対応表
http://d.hatena.ne.jp/sumim/20050927/p1