1
0
Ver Fonte

boot.js: Organizers extracted into brik

Herbert Vojčík há 11 anos atrás
pai
commit
63c4ac9db2
1 ficheiros alterados com 46 adições e 27 exclusões
  1. 46 27
      js/boot.js

+ 46 - 27
js/boot.js

@@ -77,7 +77,7 @@ function Brikz(api) {
 				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;
+				return brikz[key] = backup[key] = b;
 			}
 			Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
 			brikz.ensure = null;
@@ -113,17 +113,6 @@ function SmalltalkPackage() {}
 function SmalltalkMethod() {}
 function SmalltalkNil() {}
 
-function SmalltalkOrganizer() {
-}
-
-function SmalltalkPackageOrganizer() {
-	this.elements = [];
-}
-
-function SmalltalkClassOrganizer() {
-	this.elements = [];
-}
-
 function inherits(child, parent) {
 	child.prototype = Object.create(parent.prototype, {
 		constructor: { value: child,
@@ -137,11 +126,42 @@ inherits(SmalltalkMetaclass, SmalltalkBehavior);
 inherits(SmalltalkNil, SmalltalkObject);
 inherits(SmalltalkMethod, SmalltalkObject);
 inherits(SmalltalkPackage, SmalltalkObject);
-inherits(SmalltalkOrganizer, SmalltalkObject);
-inherits(SmalltalkPackageOrganizer, SmalltalkOrganizer);
-inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
 
 
+function OrganizeBrik(brikz, st) {
+	var org = this;
+
+	org.Organizer = function () {};
+	inherits(org.Organizer, SmalltalkObject);
+
+	org.PackageOrganizer = function () {
+		this.elements = [];
+	};
+	inherits(org.PackageOrganizer, org.Organizer);
+
+	org.ClassOrganizer = function () {
+		this.elements = [];
+	};
+	inherits(org.ClassOrganizer, org.Organizer);
+
+	org.setupClassOrganization = function (klass) {
+		klass.organization = new org.ClassOrganizer;
+		klass.organization.theClass = klass;
+	};
+
+	org.setupPackageOrganization = function (pkg) {
+		pkg.organization = new org.PackageOrganizer;
+	};
+
+	org.addOrganizationElement = function (owner, element) {
+		owner.organization.elements.addElement(element);
+	};
+
+	org.removeOrganizationElement = function (owner, element) {
+		owner.organization.elements.removeElement(element);
+	};
+}
+
 var nil = global_nil = new SmalltalkNil();
 
 function SmalltalkFactory(brikz, st) {
@@ -149,6 +169,7 @@ function SmalltalkFactory(brikz, st) {
 //	var st = this;
 
 	brikz.ensure("selectorConversion");
+	var org = brikz.ensure("organize");
 
 	/* This is the current call context object. While it is publicly available,
 		Use smalltalk.getThisContext() instead which will answer a safe copy of
@@ -235,7 +256,7 @@ function SmalltalkFactory(brikz, st) {
 	function pkg(spec) {
 		var that = new SmalltalkPackage();
 		that.pkgName = spec.pkgName;
-		that.organization = new SmalltalkPackageOrganizer();
+		org.setupPackageOrganization(that);
 		that.properties = spec.properties || {};
 		return that;
 	}
@@ -283,10 +304,7 @@ function SmalltalkFactory(brikz, st) {
 			value: function() { return 'Smalltalk ' + this.className; },
 			enumerable:false, configurable: true, writable: false
 		});
-
-		klass.organization          = new SmalltalkClassOrganizer();
-		klass.organization.theClass = klass;
-
+		org.setupClassOrganization(klass);
 		Object.defineProperty(klass, "methods", {
 			value: {},
 			enumerable: false, configurable: true, writable: true
@@ -482,7 +500,7 @@ function SmalltalkFactory(brikz, st) {
 		if(wrapped) {
 			wrappedClasses.addElement(st[className]);
 		}
-		pkg.organization.elements.addElement(st[className]);
+		org.addOrganizationElement(pkg, st[className]);
 	};
 
 	/* Create an alias for an existing class */
@@ -533,11 +551,11 @@ function SmalltalkFactory(brikz, st) {
 		}
 
 		classes.addElement(st[className]);
-		pkg.organization.elements.addElement(st[className]);
+		org.addOrganizationElement(pkg, st[className]);
 	};
 
 	st.removeClass = function(klass) {
-		klass.pkg.organization.elements.removeElement(klass);
+		org.removeOrganizationElement(klass.pkg, klass);
 		classes.removeElement(klass);
 		delete st[klass.className];
 	};
@@ -570,7 +588,7 @@ function SmalltalkFactory(brikz, st) {
 
 		// During the bootstrap, #addCompiledMethod is not used.
 		// Therefore we populate the organizer here too
-		klass.organization.elements.addElement(method.category);
+		org.addOrganizationElement(klass, method.category);
 
 		// If already initialized (else it will be done later anyway),
 		// re-initialize all subclasses to ensure the new method
@@ -854,6 +872,7 @@ inherits(SmalltalkMethodContext, SmalltalkObject);
 var api = new Smalltalk;
 var brikz = new Brikz(api);
 
+brikz.organize = OrganizeBrik;
 brikz.selectorConversion = SelectorConversionBrik;
 brikz.smalltalk = SmalltalkFactory;
 brikz.rebuild();
@@ -916,9 +935,9 @@ smalltalk.Object.klass.superclass = smalltalk.Class;
 smalltalk.wrapClassName("Smalltalk", "Kernel-Objects", Smalltalk, smalltalk.Object, false);
 smalltalk.wrapClassName("Package", "Kernel-Objects", SmalltalkPackage, smalltalk.Object, false);
 smalltalk.wrapClassName("CompiledMethod", "Kernel-Methods", SmalltalkMethod, smalltalk.Object, false);
-smalltalk.wrapClassName("Organizer", "Kernel-Objects", SmalltalkOrganizer, smalltalk.Object, false);
-smalltalk.wrapClassName("PackageOrganizer", "Kernel-Objects", SmalltalkPackageOrganizer, smalltalk.Organizer, false);
-smalltalk.wrapClassName("ClassOrganizer", "Kernel-Objects", SmalltalkClassOrganizer, smalltalk.Organizer, false);
+smalltalk.wrapClassName("Organizer", "Kernel-Objects", brikz.organize.Organizer, smalltalk.Object, false);
+smalltalk.wrapClassName("PackageOrganizer", "Kernel-Objects", brikz.organize.PackageOrganizer, smalltalk.Organizer, false);
+smalltalk.wrapClassName("ClassOrganizer", "Kernel-Objects", brikz.organize.ClassOrganizer, smalltalk.Organizer, false);
 
 
 smalltalk.wrapClassName("Number", "Kernel-Objects", Number, smalltalk.Object);