World::addComponent returns shared_ptr to the correct type instead of BaseComponent