refactor to_s