DRYed the offer model