Cleaning up the code a little and adding Iterator impl