if we're breaking the API, it might be simpler to collapse put and put_new into the same function.