attempt to streamline the class hierarchy a bit