| '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; |