You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
900 B
39 lines
900 B
'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;
|
|
|