fns need to be public for macro