an attempt at doing string conversion properly - monumental refactor