40 lines
		
	
	
		
			900 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			900 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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;
 |