What if I could make the base class dog smarter and have it instantiate the subclasses for me?
For those who don't know this approach of having a single class instantiate different subclasses depending on the arguments is a common design pattern called an Abstract Factory (or sometimes Kit). If you keep an eye out you'll start seeing it everywhere (e.g. DBI instantiates different classes depending on the arguments to connect).
Class::Factory provides a little framework for rolling this sort of stuff together if you don't want to do it yourself.