add perl version mediator pattern
add perl version visitor pattern
add perl version state pattern