This exists independently of `mutation` for three reasons:
- `mutation` needs to pass arguments to the wrapped function (would require a splat on `mutate` which is a performance hit)
- `mutation` doesn't need to prevent change
- less wrapping of wrapped things