We should generalize this even more so that it's not specific to purchase events. Maybe make this class abstract and let callers create their own factory?