Browse Source

api treated differently, mixin misses undefineds

rebuild is callable multiple times as planned
Herbert Vojčík 10 years ago
parent
commit
357893c22b
1 changed files with 29 additions and 11 deletions
  1. 29 11
      brikz.js

+ 29 - 11
brikz.js

@@ -1,24 +1,42 @@
-function Brikz(api) {
+function Brikz(api, apiKey, initKey) {
 	var brikz = this, backup = {};
+	apiKey = apiKey || 'exports';
+	initKey = initKey || '__init__';
 
-	function mixin(s, t, k) {
-		for (k=k||Object.keys(s), l=k.length, i=0; i<l; ++i) t[k[i]]=s[k[i]];
-		return t;
+	function mixin(src, target, keys) {
+		for (keys = keys || Object.keys(src), l=keys.length, i=0; i<l; ++i) {
+			var value = src[keys[i]];
+			if (typeof value !== "undefined") target[keys[i]] = value;
+		}
+		return target;
+	}
+
+	function forEach(c, fn) {
+		Object.keys(c).forEach(function(k) { if (c[k]) fn(c[k], k, c); });
 	}
 
 	Object.defineProperties(this, {
 		ensure: { value: null,
 			enumerable: false, configurable: true, writable: true},
-		rebuild: { value: function () {
-			var oapi = mixin(api, {}), obrikz = mixin(backup, {});
-			mixin({}, api, Object.keys(api)); backup = {};
-			brikz.ensure = function (key) {
-				var b = brikz[key], bak = [];
+		rebuild: { value: function() {
+			var obrikz = mixin(backup, {});
+			forEach(obrikz, function(brik) {
+				mixin({}, api, brik[apiKey] || Object.keys(brik));
+			});
+			var oapi = mixin(api, {});
+			backup = {};
+			brikz.ensure = function(key) {
+				var b = brikz[key], bak = obrikz[key];
+				mixin({}, api, Object.keys(api));
 				while (typeof b === "function") b = new b(brikz, api, bak);
-				if (b === bak) { b = obrikz[key]; mixin(oapi, api, bak); }
+				if (b && !b[apiKey]) b[apiKey] = mixin(api, {});
 				return brikz[key] = backup[key] = b;
 			}
-			Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
+			forEach(brikz, function(brik, key) { brikz.ensure(key); });
 			brikz.ensure = null;
+			mixin({}, api, Object.keys(api));
+			mixin(oapi, api);
+			forEach(brikz, function(brik) { mixin(brik[apiKey] || {}, api); });
+			forEach(brikz, function(brik) {brik[initKey] && brik[initKey]();});
 		}, enumerable: false, configurable: true, writable: false }});
 }