switch to a component-based system instead of a subclassing system