aboutsummaryrefslogtreecommitdiff
path: root/node_modules/montage/core/core.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/montage/core/core.js')
-rwxr-xr-xnode_modules/montage/core/core.js600
1 files changed, 49 insertions, 551 deletions
diff --git a/node_modules/montage/core/core.js b/node_modules/montage/core/core.js
index 8fcf7977..80597dce 100755
--- a/node_modules/montage/core/core.js
+++ b/node_modules/montage/core/core.js
@@ -10,7 +10,11 @@
10 @requires montage/core/event/binding 10 @requires montage/core/event/binding
11 @requires montage/core/event/event-manager 11 @requires montage/core/event/event-manager
12 */ 12 */
13require("core/shim"); 13require("core/shim/object");
14require("core/shim/array");
15require("core/extras/object");
16require("core/extras/array");
17require("core/extras/string");
14 18
15var ATTRIBUTE_PROPERTIES = "AttributeProperties", 19var ATTRIBUTE_PROPERTIES = "AttributeProperties",
16 UNDERSCORE = "_", 20 UNDERSCORE = "_",
@@ -20,32 +24,20 @@ var ATTRIBUTE_PROPERTIES = "AttributeProperties",
20 SERIALIZABLE = "serializable", 24 SERIALIZABLE = "serializable",
21 MODIFY = "modify"; 25 MODIFY = "modify";
22 26
23
24
25/** 27/**
26 @external Object 28 @private
27 */ 29 */
30var Array_prototype = Array.prototype;
28 31
29/* Ecmascript 5 Methods. Should be external as WebKit doesn't need it, and loaded automatically */ 32/**
30if (!Object.create) { 33 @private
31 Object._creator = function _ObjectCreator() { 34 */
32 this.__proto__ = _ObjectCreator.prototype; 35var Object_prototype = Object.prototype;
33 };
34 Object.create = function(o, properties) {
35 this._creator.prototype = o || Object.prototype;
36 //Still needs to add properties....
37 return new this._creator;
38 };
39
40 Object.getPrototypeOf = function(o) {
41 return o.__proto__;
42 };
43}
44 36
45/** 37/**
46 @class module:montage/core/core.Montage 38 @class module:montage/core/core.Montage
47 */ 39 */
48var M = exports.Montage = Object.create(Object.prototype); 40var Montage = exports.Montage = {};
49 41
50/** 42/**
51 Creates a new Montage object. 43 Creates a new Montage object.
@@ -64,7 +56,7 @@ var M = exports.Montage = Object.create(Object.prototype);
64 } 56 }
65 }); 57 });
66 */ 58 */
67Object.defineProperty(M, "create", { 59Object.defineProperty(Montage, "create", {
68 configurable: true, 60 configurable: true,
69 value: function(aPrototype, propertyDescriptor) { 61 value: function(aPrototype, propertyDescriptor) {
70 if (!propertyDescriptor) { 62 if (!propertyDescriptor) {
@@ -82,7 +74,7 @@ Object.defineProperty(M, "create", {
82 return newObject; 74 return newObject;
83 } else { 75 } else {
84 var result = Object.create(aPrototype); 76 var result = Object.create(aPrototype);
85 M.defineProperties(result, propertyDescriptor); 77 Montage.defineProperties(result, propertyDescriptor);
86 return result; 78 return result;
87 } 79 }
88 } 80 }
@@ -117,7 +109,7 @@ extendedPropertyAttributes.forEach(function(name) {
117 writable: true 109 writable: true
118 }); 110 });
119 */ 111 */
120Object.defineProperty(M, "defineProperty", { 112Object.defineProperty(Montage, "defineProperty", {
121 113
122 value: function(obj, prop, descriptor) { 114 value: function(obj, prop, descriptor) {
123 var dependencies = descriptor.dependencies; 115 var dependencies = descriptor.dependencies;
@@ -151,7 +143,7 @@ Object.defineProperty(M, "defineProperty", {
151 independentProperty; 143 independentProperty;
152 144
153 for (; (independentProperty = dependencies[i]); i++) { 145 for (; (independentProperty = dependencies[i]); i++) {
154 M.addDependencyToProperty(obj, independentProperty, prop); 146 Montage.addDependencyToProperty(obj, independentProperty, prop);
155 } 147 }
156 148
157 } 149 }
@@ -167,14 +159,14 @@ Object.defineProperty(M, "defineProperty", {
167 159
168 //this is added to enable value properties with [] or Objects that are new for every instance 160 //this is added to enable value properties with [] or Objects that are new for every instance
169 if (descriptor.distinct === true && typeof descriptor.value === "object") { 161 if (descriptor.distinct === true && typeof descriptor.value === "object") {
170 (function(internalProperty, value) { 162 (function(prop,internalProperty, value, obj) {
171 Object.defineProperty(obj, internalProperty, { 163 Object.defineProperty(obj, internalProperty, {
172 enumerable: false, 164 enumerable: false,
173 configurable: true, 165 configurable: true,
174 writable: true, 166 writable: true,
175 value: null 167 value: null
176 }); 168 });
177 if (value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype) { 169 if (value.constructor === Object && Object.getPrototypeOf(value) === Object_prototype) {
178 // we have an object literal {...} 170 // we have an object literal {...}
179 if (Object.keys(value).length !== 0) { 171 if (Object.keys(value).length !== 0) {
180 Object.defineProperty(obj, prop, { 172 Object.defineProperty(obj, prop, {
@@ -208,7 +200,7 @@ Object.defineProperty(M, "defineProperty", {
208 }); 200 });
209 } 201 }
210 202
211 } else if ((value.__proto__ || Object.getPrototypeOf(value)) === __cached__arrayProto) { 203 } else if ((value.__proto__ || Object.getPrototypeOf(value)) === Array_prototype) {
212 // we have an array literal [...] 204 // we have an array literal [...]
213 if (value.length !== 0) { 205 if (value.length !== 0) {
214 Object.defineProperty(obj, prop, { 206 Object.defineProperty(obj, prop, {
@@ -236,7 +228,7 @@ Object.defineProperty(M, "defineProperty", {
236 configurable: true, 228 configurable: true,
237 get: function() { 229 get: function() {
238 //Special case for array as isArray fails 230 //Special case for array as isArray fails
239 //Object.prototype.toString.call(Object.create([].__proto)) !== "[object Array]" 231 //Object_prototype.toString.call(Object.create([].__proto)) !== "[object Array]"
240 return this[internalProperty] || (this[internalProperty] = []); 232 return this[internalProperty] || (this[internalProperty] = []);
241 }, 233 },
242 set: function(value) { 234 set: function(value) {
@@ -278,7 +270,7 @@ Object.defineProperty(M, "defineProperty", {
278 } 270 }
279 }); 271 });
280 } 272 }
281 })(UNDERSCORE + prop, descriptor.value); 273 })(prop, UNDERSCORE + prop, descriptor.value, obj);
282 274
283 } else { 275 } else {
284 return Object.defineProperty(obj, prop, descriptor); 276 return Object.defineProperty(obj, prop, descriptor);
@@ -291,11 +283,10 @@ Object.defineProperty(M, "defineProperty", {
291 @param {Object} obj The object to which the properties are added. 283 @param {Object} obj The object to which the properties are added.
292 @param {Object} properties An object that contains one or more property descriptor objects. 284 @param {Object} properties An object that contains one or more property descriptor objects.
293 */ 285 */
294Object.defineProperty(M, "defineProperties", {value: function(obj, properties) { 286Object.defineProperty(Montage, "defineProperties", {value: function(obj, properties) {
295 287 for (var property in properties) {
296 for (var p in properties) { 288 if ("_bindingDescriptors" !== property) {
297 if ("_bindingDescriptors" !== p) { 289 this.defineProperty(obj, property, properties[property]);
298 this.defineProperty(obj, p, properties[p]);
299 } 290 }
300 } 291 }
301 return obj; 292 return obj;
@@ -327,34 +318,6 @@ var _defaultFunctionValueProperty = {
327}; 318};
328 319
329/** 320/**
330 @private
331 */
332var __cached__arrayProto = Array.prototype;
333
334/**
335 Private collection of dependencies for all dependent keys. The collection here is keyed by the dependent propertyName
336 The array for each dependent property has all the independent property names that when changed, need to signal a change in the dependent property.
337 @private
338 */
339Object.defineProperty(Object.prototype, "_dependenciesForProperty", {
340 enumerable: false,
341 writable: true,
342 value: null
343});
344
345 /**
346 Private collection of listener functions that are for dependent properties to observe their dependency properties for changes.
347 The collection here is keyed by the dependent propertyName.
348 @private
349 */
350Object.defineProperty(Object.prototype, "_dependencyListeners", /** @lends external:Object# */ {
351 enumerable: false,
352 writable: true,
353 value: null
354});
355
356
357/**
358 Adds a dependent property to another property's collection of dependencies. 321 Adds a dependent property to another property's collection of dependencies.
359 When the value of a dependent property changes, it generates a <code>change@independentProperty</code> event. 322 When the value of a dependent property changes, it generates a <code>change@independentProperty</code> event.
360 @function module:montage/core/core.Montage.addDependencyToProperty 323 @function module:montage/core/core.Montage.addDependencyToProperty
@@ -362,7 +325,7 @@ Object.defineProperty(Object.prototype, "_dependencyListeners", /** @lends exter
362 @param {String} independentProperty The name of the object's independent property. 325 @param {String} independentProperty The name of the object's independent property.
363 @param {String} dependentProperty The name of the object's dependent property. 326 @param {String} dependentProperty The name of the object's dependent property.
364 */ 327 */
365M.defineProperty(M, "addDependencyToProperty", { value: function(obj, independentProperty, dependentProperty) { 328Montage.defineProperty(Montage, "addDependencyToProperty", { value: function(obj, independentProperty, dependentProperty) {
366 329
367 // TODO optimize this so we don't keep checking over and over again 330 // TODO optimize this so we don't keep checking over and over again
368 if (!obj._dependenciesForProperty) { 331 if (!obj._dependenciesForProperty) {
@@ -385,7 +348,7 @@ M.defineProperty(M, "addDependencyToProperty", { value: function(obj, independen
385 @param {String} independentProperty The name of the object's independent property. 348 @param {String} independentProperty The name of the object's independent property.
386 @param {String} dependentProperty The name of the object's dependent property that you want to remove. 349 @param {String} dependentProperty The name of the object's dependent property that you want to remove.
387 */ 350 */