refactor and to_s