Refactored to unify the interface-vs-base-class implementations, remove reflection, and remove some generic type arguments. The interface has changed slightly as a result.