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