Избегайте магии вуду в реальном коде, когда это возможно.
При этом вы можете делать очень интересные вещи, динамически манипулируя методами.
Например, кодовые блоки в Etoys переводятся в методы Smalltalk. Другие реализации DSL также могут использовать аналогичные приемы метапрограммирования.
Немного поэкспериментировав, я придумал следующий код для переименования унарных методов:
renameMethod: oldMethod inClass: class to: newMethod
| oldSelector newSelector source parser |
oldSelector := oldMethod asSymbol.
newSelector := newMethod asSymbol.
oldSelector = newSelector ifTrue: [^self].
"Get method category"
category := (LocatedMethod location: class selector: oldSelector) category.
"Get method source code"
source := class sourceCodeAt: oldSelector.
"Replace selector in method source"
(parser := class parserClass new) parseSelector: source.
source := (newSelector asString), (source allButFirst: parser endOfLastToken).
"Compile modified source"
class compile: source classified: category.
"Remove old selector"
class removeSelector: oldSelector
Вероятно, вы могли бы найти более простой способ сделать это, если бы вы просматривали код Squeak немного дольше, чем я.