add Visitor pattern