Remove abstract class and use Interface+Trait

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | yes
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Why do we need to close the inheritance if we can use our existing interface/trait? This PR will provide trait+interface instead of class, that will allow to improve inheritance and allow to the class to extends another with real value.