Add builder pattern
Add visitor pattern