Looks like a bunch of very similar methods - here and in macro impls. Can we abstract the boilerplate away?