add Visitor Pattern