| 123456789101112131415161718192021222324252627282930313233343536373839 | 
							- 'use strict';
 
- class Mixin {
 
-     constructor(host) {
 
-         const originalMethods = {};
 
-         const overriddenMethods = this._getOverriddenMethods(this, originalMethods);
 
-         for (const key of Object.keys(overriddenMethods)) {
 
-             if (typeof overriddenMethods[key] === 'function') {
 
-                 originalMethods[key] = host[key];
 
-                 host[key] = overriddenMethods[key];
 
-             }
 
-         }
 
-     }
 
-     _getOverriddenMethods() {
 
-         throw new Error('Not implemented');
 
-     }
 
- }
 
- Mixin.install = function(host, Ctor, opts) {
 
-     if (!host.__mixins) {
 
-         host.__mixins = [];
 
-     }
 
-     for (let i = 0; i < host.__mixins.length; i++) {
 
-         if (host.__mixins[i].constructor === Ctor) {
 
-             return host.__mixins[i];
 
-         }
 
-     }
 
-     const mixin = new Ctor(host, opts);
 
-     host.__mixins.push(mixin);
 
-     return mixin;
 
- };
 
- module.exports = Mixin;
 
 
  |