I started reading Concepts, Techniques, and Models of Computer Programming because it spends a bunch of time discussing concurrency and constraint programming. I was wowwed this weekend when I got to the OO section. I didn't expect anything particularly interesting from this part. Not so.
It solved the allomorphism problem as a "oh, by the way." I just was totally blindsided by it. You can get confused method resolution when your method head is just a string or other atom. This is what happens in perl and just about every OO language I'm familiar with. In the book's pet language, your method head is often a string but isn't required to be. If the head is a "name," an unforgeable identity then it can only be invoked by call sites that have been given the method head.
I suppose this is just a side effect of having first class classes and methods. If you haven't given your method object to a call site, it can't be invoked. This is obvious, right? Still... it's neat and unperly.
Parrot's pdd 15 says methods are invoked by name. Classes, methods, and objects are PMCs though. I can get first class methods in Parrot, right?