refactor toString