I cleaned it up a bit since your last comment. I don't have a problem with its current implementation. I think further abstraction will actually make the process harder to understand.