add design pattern/visitor