Refactor addProduct

Refactor some internal methods to expose more of the functionality