After looking at it for a bit, I felt that using the builtin ObjectWrap would be acceptable and cut down on the amount of code. Using the builtin object wrap also means that we benefit from any bug fixes or improvements made there versus rolling our own version of basically the same thing.
I moved some of the logic into static methods for each of the types of objects needing creation.