visitor pattern part 1
visitor pattern part 2
visitor pattern part 3 new visitor