{ import Smalltalk/kernel } _vtbl _dump [ 0 to: self size - 1 do: [:index | | binding | binding := self bindingAt: index. (' ', (SmallInteger _value: binding _method) hex8, ' ', binding selector name) println] ] _object dump [ (String _value: self _debugName) println. self _vtbl _dump ] [ _object dump. _binding dump. _selector dump. _vtbl dump. ] _vtbl _methodAt: aSelector put: aMethod [ ('_vtbl is not accepting new methods -- ignoring attempt to add \'', aSelector name, '\'') println. ] [ _vtbl flushCache ] _vtbl bogusMethod [] _vtbl anotherBogusMethod [] _object bogusMethod ['_object is still accepting bogus methods' println] [ _object bogusMethod ] _object bogosityFilter [ 'you are no longer allowed to run bogusMethods -- returning you to sender' println. ] [ _vtbl _vtbl at: (_selector intern: '_methodAt:put:') put: (_object _vtbl at: (_selector intern: '_methodAt:put:')). _vtbl flushCache. ] _vtbl rejectingLookup: aSelector [ ^aSelector = 'bogusMethod' ifTrue: [_object _vtbl at: (_selector intern: 'bogosityFilter')] ifFalse: [self basicLookup: aSelector] ] [ 'run bogus: ' print. _object bogusMethod. 'disable bogus...' println. _vtbl _vtbl at: (_selector intern: 'basicLookup:') put: (_vtbl _vtbl at: (_selector intern: 'lookup:')). _vtbl _vtbl at: (_selector intern: 'lookup:') put: (_vtbl _vtbl at: (_selector intern: 'rejectingLookup:')). _vtbl flushCache. 'run bogus: ' print. _object bogusMethod. ]