#81 adding abstract factory option and tests