added Visitor Pattern