refactor again