abstracting visitor stuff and more work on init