|
@@ -47,28 +47,46 @@ var global_smalltalk, global_nil, global__st;
|
|
|
|
|
|
/* Reconfigurable micro composition system, https://github.com/herby/brikz */
|
|
|
|
|
|
-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 }});
|
|
|
}
|
|
|
|
|
@@ -990,43 +1008,43 @@ function BootstrapBrik(brikz, st) {
|
|
|
brikz.ensure("organize");
|
|
|
brikz.ensure("runtime");
|
|
|
|
|
|
- /***************************************** BOOTSTRAP ******************************************/
|
|
|
-
|
|
|
- st.wrapClassName("Object", "Kernel-Objects", SmalltalkObject, undefined, false);
|
|
|
- st.wrapClassName("Behavior", "Kernel-Classes", brikz.classes.Behavior, st.Object, false);
|
|
|
- st.wrapClassName("Metaclass", "Kernel-Classes", brikz.classes.Metaclass, st.Behavior, false);
|
|
|
- st.wrapClassName("Class", "Kernel-Classes", brikz.classes.Class, st.Behavior, false);
|
|
|
-
|
|
|
- st.Object.klass.superclass = st.Class;
|
|
|
-
|
|
|
- st.wrapClassName("Smalltalk", "Kernel-Objects", Smalltalk, st.Object, false);
|
|
|
- st.wrapClassName("Package", "Kernel-Objects", brikz.classes.Package, st.Object, false);
|
|
|
- st.wrapClassName("CompiledMethod", "Kernel-Methods", brikz.methods.Method, st.Object, false);
|
|
|
- st.wrapClassName("Organizer", "Kernel-Objects", brikz.organize.Organizer, st.Object, false);
|
|
|
- st.wrapClassName("PackageOrganizer", "Kernel-Objects", brikz.organize.PackageOrganizer, st.Organizer, false);
|
|
|
- st.wrapClassName("ClassOrganizer", "Kernel-Objects", brikz.organize.ClassOrganizer, st.Organizer, false);
|
|
|
-
|
|
|
- st.wrapClassName("Number", "Kernel-Objects", Number, st.Object);
|
|
|
- st.wrapClassName("BlockClosure", "Kernel-Methods", Function, st.Object);
|
|
|
- st.wrapClassName("Boolean", "Kernel-Objects", Boolean, st.Object);
|
|
|
- st.wrapClassName("Date", "Kernel-Objects", Date, st.Object);
|
|
|
- st.wrapClassName("UndefinedObject", "Kernel-Objects", SmalltalkNil, st.Object, false);
|
|
|
-
|
|
|
- st.addClass("Collection", st.Object, null, "Kernel-Collections");
|
|
|
- st.addClass("IndexableCollection", st.Collection, null, "Kernel-Collections");
|
|
|
- st.addClass("SequenceableCollection", st.IndexableCollection, null, "Kernel-Collections");
|
|
|
- st.addClass("CharacterArray", st.SequenceableCollection, null, "Kernel-Collections");
|
|
|
- st.wrapClassName("String", "Kernel-Collections", String, st.CharacterArray);
|
|
|
- st.wrapClassName("Array", "Kernel-Collections", Array, st.SequenceableCollection);
|
|
|
- st.wrapClassName("RegularExpression", "Kernel-Collections", RegExp, st.Object);
|
|
|
-
|
|
|
- st.wrapClassName("Error", "Kernel-Exceptions", Error, st.Object);
|
|
|
- st.wrapClassName("MethodContext", "Kernel-Methods", brikz.runtime.MethodContext, st.Object, false);
|
|
|
-
|
|
|
- /* Alias definitions */
|
|
|
-
|
|
|
- st.alias(st.Array, "OrderedCollection");
|
|
|
- st.alias(st.Date, "Time");
|
|
|
+ this.bootstrap = function () {
|
|
|
+ st.wrapClassName("Object", "Kernel-Objects", SmalltalkObject, undefined, false);
|
|
|
+ st.wrapClassName("Behavior", "Kernel-Classes", brikz.classes.Behavior, st.Object, false);
|
|
|
+ st.wrapClassName("Metaclass", "Kernel-Classes", brikz.classes.Metaclass, st.Behavior, false);
|
|
|
+ st.wrapClassName("Class", "Kernel-Classes", brikz.classes.Class, st.Behavior, false);
|
|
|
+
|
|
|
+ st.Object.klass.superclass = st.Class;
|
|
|
+
|
|
|
+ st.wrapClassName("Smalltalk", "Kernel-Objects", Smalltalk, st.Object, false);
|
|
|
+ st.wrapClassName("Package", "Kernel-Objects", brikz.classes.Package, st.Object, false);
|
|
|
+ st.wrapClassName("CompiledMethod", "Kernel-Methods", brikz.methods.Method, st.Object, false);
|
|
|
+ st.wrapClassName("Organizer", "Kernel-Objects", brikz.organize.Organizer, st.Object, false);
|
|
|
+ st.wrapClassName("PackageOrganizer", "Kernel-Objects", brikz.organize.PackageOrganizer, st.Organizer, false);
|
|
|
+ st.wrapClassName("ClassOrganizer", "Kernel-Objects", brikz.organize.ClassOrganizer, st.Organizer, false);
|
|
|
+
|
|
|
+ st.wrapClassName("Number", "Kernel-Objects", Number, st.Object);
|
|
|
+ st.wrapClassName("BlockClosure", "Kernel-Methods", Function, st.Object);
|
|
|
+ st.wrapClassName("Boolean", "Kernel-Objects", Boolean, st.Object);
|
|
|
+ st.wrapClassName("Date", "Kernel-Objects", Date, st.Object);
|
|
|
+ st.wrapClassName("UndefinedObject", "Kernel-Objects", SmalltalkNil, st.Object, false);
|
|
|
+
|
|
|
+ st.addClass("Collection", st.Object, null, "Kernel-Collections");
|
|
|
+ st.addClass("IndexableCollection", st.Collection, null, "Kernel-Collections");
|
|
|
+ st.addClass("SequenceableCollection", st.IndexableCollection, null, "Kernel-Collections");
|
|
|
+ st.addClass("CharacterArray", st.SequenceableCollection, null, "Kernel-Collections");
|
|
|
+ st.wrapClassName("String", "Kernel-Collections", String, st.CharacterArray);
|
|
|
+ st.wrapClassName("Array", "Kernel-Collections", Array, st.SequenceableCollection);
|
|
|
+ st.wrapClassName("RegularExpression", "Kernel-Collections", RegExp, st.Object);
|
|
|
+
|
|
|
+ st.wrapClassName("Error", "Kernel-Exceptions", Error, st.Object);
|
|
|
+ st.wrapClassName("MethodContext", "Kernel-Methods", brikz.runtime.MethodContext, st.Object, false);
|
|
|
+
|
|
|
+ /* Alias definitions */
|
|
|
+
|
|
|
+ st.alias(st.Array, "OrderedCollection");
|
|
|
+ st.alias(st.Date, "Time");
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
brikz.dnu = DNUBrik;
|
|
@@ -1044,6 +1062,7 @@ brikz.augments = AugmentsBrik;
|
|
|
brikz.bootstrap = BootstrapBrik;
|
|
|
|
|
|
brikz.rebuild();
|
|
|
+brikz.bootstrap.bootstrap();
|
|
|
|
|
|
global_smalltalk = api;
|
|
|
global_nil = nil;
|