finally a decent iterator