Refactor of the interface and abstract class. Now supports a working example.