complete visitor pattern