The only difference is the selection of source() or target(), is it worth abstracting?