added iterator protocol