class MapStructAbstractGateway implements Gateway<DE, AP> {

    public DE add(AP payload) {
        Preconditions.checkNotNull(payload);
        HE hibernateEntity = domainAddPayloadToHibernateEntityConverter.convert(payload);
        dao.create(hibernateEntity);
        return hibernateEntityToDomainEntityConverter.convert(hibernateEntity);
    }

    protected  MapStructAbstractGateway(
            Converter<AP, HE> domainAddPayloadToHibernateEntityConverter,
            Merger<DE, HE> domainEntityToHibernateEntityMerger,
            Converter<HE, DE> hibernateEntityToDomainEntityConverter,
            Converter<List<HE>, List<DE>> hibernateEntitiesToDomainEntitiesConverter,
            D dao
    );

}