Factor out "Link" abstraction rather than using !