>>1
Sounds like pretty good CLOS design. By Smalltalk standards it would be stupid, but it turns out that inverting your objects to put methods outside works very well, and is pretty much equivalent to putting your methods inside. IIRC, theoretical work in this area has proved their equivalence. Something coming out of Sussman and Steele's realization that lambda was the same as the actor model, I believe. It makes multiple dispatch conceptually simple too.
Whichever type of object system you use, you're in pretty good shape until you use some C++/Java type OO perversion.