no need for sourceV/targetV methods; lazy vals instead