Refactored for generics. This should allow PMBuilder to leverage the same interface