When we started on a new project, we knew that more than one customer would eventually want to use it. We tried to make it open and extensible, but unsurprisingly didn't anticipate the things that would actually change for the next customer.

We (meaning "I") have since decided that we can't anticipate the future changes well enough to already have them handled. By the third iteration, we know how it should actually be built, and the base classes always come out cleaner and more flexible than the original anyway.