refactor whole entity component system