extract visitor into its own file