Visitor design pattern (with composite and builder)