abstracting visitor