Never try to abstract something until I'm on my third implementation of something like it. The first time I lack context for what is likely to change. The second time you have to watch out for second system effect, adding all of the things you wanted in the first version. But the third time you tend to have the experience and knowledge to do it right.
This is a rule of thumb that should be drilled into the heads of anyone who is even thinking of drinking the patterns kool-aid.