added iterator support