add visitor design pattern