in reply to OO & multiple inheritance.

Like someone already pointed out, you have inheritance backwards. Would you say a "Cat is a type of Animal" or "Animal is a type of Cat"? @ISA is used to express this is a relationship.

Another tip is that you should never have to store something class-specific in a parent class. For example, TYPE should no more in Animal than SOUND. It's better to override a method (class function), like you did with speak.

I also agree with not using ref($proto). It's a legacy from languages which are unable to name their constructors. In Perl, if you need a copy constructor, go ahead and call it copy.