brikz.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. function Brikz(api, apiKey, initKey) {
  2. var brikz = this, backup = {};
  3. apiKey = apiKey || 'exports';
  4. initKey = initKey || '__init__';
  5. function mixin(src, target, keys) {
  6. for (keys = keys || Object.keys(src), l=keys.length, i=0; i<l; ++i) {
  7. var value = src[keys[i]];
  8. if (typeof value !== "undefined") target[keys[i]] = value;
  9. }
  10. return target;
  11. }
  12. function forEach(c, fn) {
  13. Object.keys(c).forEach(function(k) { if (c[k]) fn(c[k], k, c); });
  14. }
  15. Object.defineProperties(this, {
  16. ensure: { value: null,
  17. enumerable: false, configurable: true, writable: true},
  18. rebuild: { value: function() {
  19. var obrikz = mixin(backup, {});
  20. forEach(obrikz, function(brik) {
  21. mixin({}, api, brik[apiKey] || Object.keys(brik));
  22. });
  23. var oapi = mixin(api, {});
  24. backup = {};
  25. brikz.ensure = function(key) {
  26. var b = brikz[key], bak = obrikz[key];
  27. mixin({}, api, Object.keys(api));
  28. while (typeof b === "function") b = new b(brikz, api, bak);
  29. if (b && !b[apiKey]) b[apiKey] = mixin(api, {});
  30. return brikz[key] = backup[key] = b;
  31. }
  32. forEach(brikz, function(brik, key) { brikz.ensure(key); });
  33. brikz.ensure = null;
  34. mixin({}, api, Object.keys(api));
  35. mixin(oapi, api);
  36. forEach(brikz, function(brik) { mixin(brik[apiKey] || {}, api); });
  37. forEach(brikz, function(brik) {brik[initKey] && brik[initKey]();});
  38. }, enumerable: false, configurable: true, writable: false }});
  39. }