Parcourir la source

boot.js: brikz introduced

Herbert Vojčík il y a 11 ans
Parent
commit
59c54353ec
1 fichiers modifiés avec 39 ajouts et 3 suppressions
  1. 39 3
      js/boot.js

+ 39 - 3
js/boot.js

@@ -57,6 +57,35 @@ var global_smalltalk, global_nil, global__st;
 
 (function () {
 
+/* Reconfigurable micro composition system, https://github.com/herby/brikz */
+
+function Brikz(api) {
+	var brikz = this, backup = {};
+
+	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;
+	}
+
+	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 = [];
+				while (typeof b === "function") b = new b(brikz, api, bak);
+				if (b === bak) { b = obrikz[key]; mixin(oapi, api, bak); }
+				brikz[key] = backup[key] = b;
+			}
+			Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
+			brikz.ensure = null;
+		}, enumerable: false, configurable: true, writable: false }});
+}
+
+/* Brikz end */
+
 /* Array extensions */
 
 Array.prototype.addElement = function(el) {
@@ -115,9 +144,9 @@ inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
 
 var nil = global_nil = new SmalltalkNil();
 
-function Smalltalk() {
+function SmalltalkFactory(brikz, st) {
 
-	var st = this;
+//	var st = this;
 
 	/* This is the current call context object. While it is publicly available,
 		Use smalltalk.getThisContext() instead which will answer a safe copy of
@@ -797,6 +826,7 @@ function Smalltalk() {
 	};
 }
 
+function Smalltalk() {}
 inherits(Smalltalk, SmalltalkObject);
 
 if(this.jQuery) {
@@ -817,7 +847,13 @@ SmalltalkMethodContext.prototype.lookupClass = null;
 
 inherits(SmalltalkMethodContext, SmalltalkObject);
 
-var smalltalk = global_smalltalk = new Smalltalk();
+var api = new Smalltalk;
+var brikz = new Brikz(api);
+
+brikz.smalltalk = SmalltalkFactory;
+brikz.rebuild();
+
+var smalltalk = global_smalltalk = api;
 
 SmalltalkMethodContext.prototype.fill = function(receiver, selector, locals, lookupClass) {
 	this.receiver    = receiver;