Introduce a weird double dispatch to get around encapsulation issues!