refactor of IGameObject