Add remove() functionality to Iterator. Throw \OutOfRangeException if  Iterator->replace() or Iterator->remove() are called when the Iterator is out of range.
Create factories and inject dependencies instead of hard-coding them into implementations