allow `set` to take a proc