add Iterator pattern