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