1 (function() { 2 3 var IS_DONTENUM_BUGGY = (function(){ 4 for (var p in { toString: 1 }) { 5 if (p === 'toString') return false; 6 } 7 return true; 8 })(); 9 10 var addMethods; 11 if (IS_DONTENUM_BUGGY) { 12 /** @ignore */ 13 addMethods = function(klass, source) { 14 if (source.toString !== Object.prototype.toString) { 15 klass.prototype.toString = source.toString; 16 } 17 if (source.valueOf !== Object.prototype.valueOf) { 18 klass.prototype.valueOf = source.valueOf; 19 } 20 for (var property in source) { 21 klass.prototype[property] = source[property]; 22 } 23 }; 24 } 25 else { 26 /** @ignore */ 27 addMethods = function(klass, source) { 28 for (var property in source) { 29 klass.prototype[property] = source[property]; 30 } 31 }; 32 } 33 34 function subclass() { }; 35 36 /** 37 * Helper for creation of "classes" 38 * @method createClass 39 * @memberOf fabric.util 40 */ 41 function createClass() { 42 var parent = null, 43 properties = slice.call(arguments, 0); 44 45 if (typeof properties[0] === 'function') { 46 parent = properties.shift(); 47 } 48 function klass() { 49 this.initialize.apply(this, arguments); 50 } 51 52 klass.superclass = parent; 53 klass.subclasses = [ ]; 54 55 if (parent) { 56 subclass.prototype = parent.prototype; 57 klass.prototype = new subclass; 58 parent.subclasses.push(klass); 59 } 60 for (var i = 0, length = properties.length; i < length; i++) { 61 addMethods(klass, properties[i]); 62 } 63 if (!klass.prototype.initialize) { 64 klass.prototype.initialize = emptyFunction; 65 } 66 klass.prototype.constructor = klass; 67 return klass; 68 } 69 70 fabric.util.createClass = createClass; 71 })();