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