art-standard-lib
Version:
The Standard Library for JavaScript that aught to be.
209 lines (173 loc) • 6.38 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var MinimalBaseObject, capitalize, isFunction, isPlainObject, isString, ref;
capitalize = require('./Core').capitalize;
ref = require('./TypesExtended'), isFunction = ref.isFunction, isString = ref.isString, isPlainObject = ref.isPlainObject;
module.exports = MinimalBaseObject = (function() {
var addGetter, addGetters, addProperties, addSetter, addSetters, defProperties, defProperty, propGetterName, propInternalName, propListStringToArray, propSetterName;
function MinimalBaseObject() {}
MinimalBaseObject.propInternalName = propInternalName = function(prop) {
return "_" + prop;
};
/*
IN: arguments is a list of strings or objects
strings: are just the names of the properties
objects: map from prop names to getter/setter functions
*/
MinimalBaseObject.getter = function() {
return defProperties(this.prototype, arguments, true, false);
};
MinimalBaseObject.setter = function() {
return defProperties(this.prototype, arguments, false, true);
};
MinimalBaseObject.addGetter = function(prop, getter) {
return this._addGetter(this.prototype, prop, getter);
};
MinimalBaseObject.addSetter = function(prop, setter) {
return this._addSetter(this.prototype, prop, setter);
};
MinimalBaseObject.addClassGetter = function(prop, getter) {
return this._addGetter(this, prop, getter);
};
MinimalBaseObject.addClassSetter = function(prop, setter) {
return this._addSetter(this, prop, setter);
};
/*
IN: arguments is a list of strings or objects
strings: are just the names of the properties
objects: map from prop names to initializers
*/
MinimalBaseObject.property = function() {
return defProperties(this.prototype, arguments, true, true);
};
MinimalBaseObject.classGetter = function() {
return defProperties(this, arguments, true, false);
};
MinimalBaseObject.classSetter = function() {
return defProperties(this, arguments, false, true);
};
MinimalBaseObject.classProperty = function() {
return defProperties(this, arguments, true, true);
};
MinimalBaseObject.getPropGetterName = propGetterName = function(prop) {
return "get" + capitalize(prop);
};
MinimalBaseObject.getPropSetterName = propSetterName = function(prop) {
return "set" + capitalize(prop);
};
MinimalBaseObject._propGetterName = function(v) {
console.warn("DEPRICATED - use getPropGetterName");
return propGetterName(v);
};
MinimalBaseObject._propSetterName = function(v) {
console.warn("DEPRICATED - use getPropSetterName");
return propSetterName(v);
};
MinimalBaseObject._addGetter = addGetter = function(obj, prop, getter) {
obj[propGetterName(prop)] = getter;
if (!isFunction(getter)) {
getter = (function() {
return getter;
});
}
Object.defineProperty(obj, prop, {
get: getter,
configurable: true
});
return prop;
};
MinimalBaseObject._addSetter = addSetter = function(obj, prop, setter) {
obj[propSetterName(prop)] = setter;
Object.defineProperty(obj, prop, {
set: setter,
configurable: true
});
return prop;
};
MinimalBaseObject._addGetters = addGetters = function(obj, map) {
var getter, prop;
for (prop in map) {
getter = map[prop];
addGetter(obj, prop, getter);
}
return map;
};
MinimalBaseObject._addSetters = addSetters = function(obj, map) {
var prop, setter;
for (prop in map) {
setter = map[prop];
addSetter(obj, prop, setter);
}
return map;
};
MinimalBaseObject._addProperties = addProperties = function(obj, map) {
var initializer, prop;
for (prop in map) {
initializer = map[prop];
defProperty(obj, prop, true, true, initializer);
}
return map;
};
MinimalBaseObject._defProperty = defProperty = function(obj, prop, defineGetter, defineSetter, initializer) {
var propName;
propName = propInternalName(prop);
if (defineGetter) {
addGetter(obj, prop, obj[propGetterName(prop)] = isFunction(initializer) ? function() {
if (this[propName] != null) {
return this[propName];
} else {
return this[propName] = initializer();
}
} : initializer != null ? function() {
if (this[propName] != null) {
return this[propName];
} else {
return this[propName] = initializer;
}
} : function() {
return this[propName];
});
}
if (defineSetter) {
return addSetter(obj, prop, function(v) {
return this[propName] = v;
});
}
};
MinimalBaseObject._defProperties = defProperties = function(obj, props, defineGetter, defineSetter) {
var i, len, prop, propFromString, propMap, results;
results = [];
for (i = 0, len = props.length; i < len; i++) {
prop = props[i];
if (isPlainObject(propMap = prop)) {
if (defineGetter && defineSetter) {
results.push(addProperties(obj, propMap));
} else if (defineGetter) {
results.push(addGetters(obj, propMap));
} else {
results.push(addSetters(obj, propMap));
}
} else if (isString(prop)) {
results.push((function() {
var j, len1, ref1, results1;
ref1 = propListStringToArray(prop);
results1 = [];
for (j = 0, len1 = ref1.length; j < len1; j++) {
propFromString = ref1[j];
results1.push(defProperty(obj, propFromString, defineGetter, defineSetter, null));
}
return results1;
})());
} else {
throw new Error("invalid value. Expected string or plain-object:", prop);
}
}
return results;
};
MinimalBaseObject._propListStringToArray = propListStringToArray = function(propList) {
return propList.match(/[_a-z][_a-z0-9]*/gi);
};
return MinimalBaseObject;
})();
}).call(this);
//# sourceMappingURL=MinimalBaseObject.js.map