Преглед изворни кода

Better handling of system announcements and organizers

Nicolas Petton пре 11 година
родитељ
комит
8bd70b8de2

+ 98 - 5
js/Kernel-Announcements.deploy.js

@@ -183,19 +183,46 @@ smalltalk.SystemAnnouncement);
 
 
 
-smalltalk.addClass('ClassAdded', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassAnnouncement', smalltalk.SystemAnnouncement, ['theClass'], 'Kernel-Announcements');
+smalltalk.addMethod(
+"_theClass",
+smalltalk.method({
+selector: "theClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=self["@theClass"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"theClass",{}, smalltalk.ClassAnnouncement)})},
+messageSends: []}),
+smalltalk.ClassAnnouncement);
+
+smalltalk.addMethod(
+"_theClass_",
+smalltalk.method({
+selector: "theClass:",
+fn: function (aClass){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
self["@theClass"]=aClass;
+return self}, function($ctx1) {$ctx1.fill(self,"theClass:",{aClass:aClass}, smalltalk.ClassAnnouncement)})},
+messageSends: []}),
+smalltalk.ClassAnnouncement);
 
 
-smalltalk.addClass('ClassCommentChanged', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
 
+smalltalk.addClass('ClassAdded', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 
-smalltalk.addClass('ClassDefinitionChanged', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
 
+smalltalk.addClass('ClassCommentChanged', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 
-smalltalk.addClass('ClassRemoved', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
 
+smalltalk.addClass('ClassDefinitionChanged', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 
-smalltalk.addClass('ClassRenamed', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+
+smalltalk.addClass('ClassRemoved', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('ClassRenamed', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 
 
 smalltalk.addClass('MethodAnnouncement', smalltalk.SystemAnnouncement, ['method'], 'Kernel-Announcements');
@@ -258,3 +285,69 @@ smalltalk.MethodModified);
 smalltalk.addClass('MethodRemoved', smalltalk.MethodAnnouncement, [], 'Kernel-Announcements');
 
 
+smalltalk.addClass('PackageAnnouncement', smalltalk.SystemAnnouncement, ['package'], 'Kernel-Announcements');
+smalltalk.addMethod(
+"_package",
+smalltalk.method({
+selector: "package",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=self["@package"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"package",{}, smalltalk.PackageAnnouncement)})},
+messageSends: []}),
+smalltalk.PackageAnnouncement);
+
+smalltalk.addMethod(
+"_package_",
+smalltalk.method({
+selector: "package:",
+fn: function (aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
self["@package"]=aPackage;
+return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage}, smalltalk.PackageAnnouncement)})},
+messageSends: []}),
+smalltalk.PackageAnnouncement);
+
+
+
+smalltalk.addClass('PackageAdded', smalltalk.PackageAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('PackageRemoved', smalltalk.PackageAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('ProtocolAnnouncement', smalltalk.SystemAnnouncement, ['protocol'], 'Kernel-Announcements');
+smalltalk.addMethod(
+"_protocol",
+smalltalk.method({
+selector: "protocol",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=self["@protocol"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"protocol",{}, smalltalk.ProtocolAnnouncement)})},
+messageSends: []}),
+smalltalk.ProtocolAnnouncement);
+
+smalltalk.addMethod(
+"_protocol_",
+smalltalk.method({
+selector: "protocol:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
self["@protocol"]=aString;
+return self}, function($ctx1) {$ctx1.fill(self,"protocol:",{aString:aString}, smalltalk.ProtocolAnnouncement)})},
+messageSends: []}),
+smalltalk.ProtocolAnnouncement);
+
+
+
+smalltalk.addClass('ProtocolAdded', smalltalk.ProtocolAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('ProtocolRemoved', smalltalk.ProtocolAnnouncement, [], 'Kernel-Announcements');
+
+

+ 128 - 5
js/Kernel-Announcements.js

@@ -252,23 +252,60 @@ smalltalk.SystemAnnouncement);
 
 
 
-smalltalk.addClass('ClassAdded', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassAnnouncement', smalltalk.SystemAnnouncement, ['theClass'], 'Kernel-Announcements');
+smalltalk.addMethod(
+"_theClass",
+smalltalk.method({
+selector: "theClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=self["@theClass"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"theClass",{}, smalltalk.ClassAnnouncement)})},
+args: [],
+source: "theClass\x0a\x09^ theClass",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassAnnouncement);
+
+smalltalk.addMethod(
+"_theClass_",
+smalltalk.method({
+selector: "theClass:",
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
self["@theClass"]=aClass;
+return self}, function($ctx1) {$ctx1.fill(self,"theClass:",{aClass:aClass}, smalltalk.ClassAnnouncement)})},
+args: ["aClass"],
+source: "theClass: aClass\x0a\x09theClass := aClass",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ClassAnnouncement);
+
+
+
+smalltalk.addClass('ClassAdded', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 smalltalk.ClassAdded.comment="I am emitted when a class is added to the system.\x0aSee ClassBuilder >> #addSubclassOf:... methods"
 
 
-smalltalk.addClass('ClassCommentChanged', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassCommentChanged', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 smalltalk.ClassCommentChanged.comment="I am emitted when the comment of a class changes. (Behavior >> #comment)"
 
 
-smalltalk.addClass('ClassDefinitionChanged', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassDefinitionChanged', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 smalltalk.ClassDefinitionChanged.comment="I am emitted when the defintion of a class changes.\x0aSee ClassBuilder >> #class:instanceVariableNames:"
 
 
-smalltalk.addClass('ClassRemoved', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassRemoved', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 smalltalk.ClassRemoved.comment="I am emitted when a class is removed.\x0aSee Smalltalk >> #removeClass:"
 
 
-smalltalk.addClass('ClassRenamed', smalltalk.SystemAnnouncement, [], 'Kernel-Announcements');
+smalltalk.addClass('ClassRenamed', smalltalk.ClassAnnouncement, [], 'Kernel-Announcements');
 smalltalk.ClassRenamed.comment="I am emitted when a class is renamed.\x0aSee ClassBuilder >> #renameClass:to:"
 
 
@@ -352,3 +389,89 @@ smalltalk.MethodModified);
 smalltalk.addClass('MethodRemoved', smalltalk.MethodAnnouncement, [], 'Kernel-Announcements');
 
 
+smalltalk.addClass('PackageAnnouncement', smalltalk.SystemAnnouncement, ['package'], 'Kernel-Announcements');
+smalltalk.addMethod(
+"_package",
+smalltalk.method({
+selector: "package",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=self["@package"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"package",{}, smalltalk.PackageAnnouncement)})},
+args: [],
+source: "package\x0a\x09^ package",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.PackageAnnouncement);
+
+smalltalk.addMethod(
+"_package_",
+smalltalk.method({
+selector: "package:",
+category: 'accessing',
+fn: function (aPackage){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
self["@package"]=aPackage;
+return self}, function($ctx1) {$ctx1.fill(self,"package:",{aPackage:aPackage}, smalltalk.PackageAnnouncement)})},
+args: ["aPackage"],
+source: "package: aPackage\x0a\x09package := aPackage",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.PackageAnnouncement);
+
+
+
+smalltalk.addClass('PackageAdded', smalltalk.PackageAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('PackageRemoved', smalltalk.PackageAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('ProtocolAnnouncement', smalltalk.SystemAnnouncement, ['protocol'], 'Kernel-Announcements');
+smalltalk.addMethod(
+"_protocol",
+smalltalk.method({
+selector: "protocol",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=self["@protocol"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"protocol",{}, smalltalk.ProtocolAnnouncement)})},
+args: [],
+source: "protocol\x0a\x09^ protocol",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ProtocolAnnouncement);
+
+smalltalk.addMethod(
+"_protocol_",
+smalltalk.method({
+selector: "protocol:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
self["@protocol"]=aString;
+return self}, function($ctx1) {$ctx1.fill(self,"protocol:",{aString:aString}, smalltalk.ProtocolAnnouncement)})},
+args: ["aString"],
+source: "protocol: aString\x0a\x09protocol := aString",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.ProtocolAnnouncement);
+
+
+
+smalltalk.addClass('ProtocolAdded', smalltalk.ProtocolAnnouncement, [], 'Kernel-Announcements');
+
+
+smalltalk.addClass('ProtocolRemoved', smalltalk.ProtocolAnnouncement, [], 'Kernel-Announcements');
+
+

+ 2 - 5
js/Kernel-Classes.deploy.js

@@ -15,13 +15,11 @@ _st(self)._basicAddCompiledMethod_(aMethod);
 $1=oldMethod;
 if(($receiver = $1) == nil || $receiver == undefined){
 $2=_st((smalltalk.MethodAdded || MethodAdded))._new();
-_st($2)._theClass_(self);
 _st($2)._method_(aMethod);
 $3=_st($2)._yourself();
 announcement=$3;
 } else {
 $4=_st((smalltalk.MethodModified || MethodModified))._new();
-_st($4)._theClass_(self);
 _st($4)._oldMethod_(oldMethod);
 _st($4)._method_(aMethod);
 $5=_st($4)._yourself();
@@ -29,7 +27,7 @@ announcement=$5;
 };
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_(announcement);
 return self}, function($ctx1) {$ctx1.fill(self,"addCompiledMethod:",{aMethod:aMethod,oldMethod:oldMethod,announcement:announcement}, smalltalk.Behavior)})},
-messageSends: ["at:ifAbsent:", "selector", "methodDictionary", "basicAddCompiledMethod:", "ifNil:ifNotNil:", "theClass:", "new", "method:", "yourself", "oldMethod:", "announce:", "current"]}),
+messageSends: ["at:ifAbsent:", "selector", "methodDictionary", "basicAddCompiledMethod:", "ifNil:ifNotNil:", "method:", "new", "yourself", "oldMethod:", "announce:", "current"]}),
 smalltalk.Behavior);
 
 smalltalk.addMethod(
@@ -486,12 +484,11 @@ var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
 _st(self)._basicRemoveCompiledMethod_(aMethod);
 $1=_st((smalltalk.MethodRemoved || MethodRemoved))._new();
-_st($1)._theClass_(self);
 _st($1)._method_(aMethod);
 $2=_st($1)._yourself();
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, function($ctx1) {$ctx1.fill(self,"removeCompiledMethod:",{aMethod:aMethod}, smalltalk.Behavior)})},
-messageSends: ["basicRemoveCompiledMethod:", "announce:", "theClass:", "new", "method:", "yourself", "current"]}),
+messageSends: ["basicRemoveCompiledMethod:", "announce:", "method:", "new", "yourself", "current"]}),
 smalltalk.Behavior);
 
 smalltalk.addMethod(

+ 4 - 7
js/Kernel-Classes.js

@@ -17,13 +17,11 @@ _st(self)._basicAddCompiledMethod_(aMethod);
 $1=oldMethod;
 if(($receiver = $1) == nil || $receiver == undefined){
 $2=_st((smalltalk.MethodAdded || MethodAdded))._new();
-_st($2)._theClass_(self);
 _st($2)._method_(aMethod);
 $3=_st($2)._yourself();
 announcement=$3;
 } else {
 $4=_st((smalltalk.MethodModified || MethodModified))._new();
-_st($4)._theClass_(self);
 _st($4)._oldMethod_(oldMethod);
 _st($4)._method_(aMethod);
 $5=_st($4)._yourself();
@@ -32,8 +30,8 @@ announcement=$5;
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_(announcement);
 return self}, function($ctx1) {$ctx1.fill(self,"addCompiledMethod:",{aMethod:aMethod,oldMethod:oldMethod,announcement:announcement}, smalltalk.Behavior)})},
 args: ["aMethod"],
-source: "addCompiledMethod: aMethod\x0a\x09| oldMethod announcement |\x0a    \x0a\x09oldMethod := self methodDictionary \x0a    \x09at: aMethod selector \x0a        ifAbsent: [ nil ].\x0a    \x0a\x09self basicAddCompiledMethod: aMethod.\x0a    \x0a    announcement := oldMethod \x0a    \x09ifNil: [\x0a\x09\x09    MethodAdded new\x0a       \x09\x09\x09 \x09theClass: self;\x0a\x09\x09            method: aMethod;\x0a       \x09\x09\x09    yourself ]\x0a    \x09ifNotNil: [\x0a          \x09MethodModified new\x0a       \x09\x09\x09 \x09theClass: self;\x0a                    oldMethod: oldMethod; \x0a\x09\x09            method: aMethod;\x0a       \x09\x09\x09    yourself ].\x0a                    \x0a\x09SystemAnnouncer current\x0a\x09\x09   \x09\x09announce: announcement",
-messageSends: ["at:ifAbsent:", "selector", "methodDictionary", "basicAddCompiledMethod:", "ifNil:ifNotNil:", "theClass:", "new", "method:", "yourself", "oldMethod:", "announce:", "current"],
+source: "addCompiledMethod: aMethod\x0a\x09| oldMethod announcement |\x0a    \x0a\x09oldMethod := self methodDictionary \x0a    \x09at: aMethod selector \x0a        ifAbsent: [ nil ].\x0a    \x0a\x09self basicAddCompiledMethod: aMethod.\x0a    \x0a    announcement := oldMethod \x0a    \x09ifNil: [\x0a\x09\x09    MethodAdded new\x0a\x09\x09            method: aMethod;\x0a       \x09\x09\x09    yourself ]\x0a    \x09ifNotNil: [\x0a          \x09MethodModified new\x0a                    oldMethod: oldMethod; \x0a\x09\x09            method: aMethod;\x0a       \x09\x09\x09    yourself ].\x0a                    \x0a\x09SystemAnnouncer current\x0a\x09\x09   \x09\x09announce: announcement",
+messageSends: ["at:ifAbsent:", "selector", "methodDictionary", "basicAddCompiledMethod:", "ifNil:ifNotNil:", "method:", "new", "yourself", "oldMethod:", "announce:", "current"],
 referencedClasses: ["MethodAdded", "MethodModified", "SystemAnnouncer"]
 }),
 smalltalk.Behavior);
@@ -643,14 +641,13 @@ var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1,$2;
 _st(self)._basicRemoveCompiledMethod_(aMethod);
 $1=_st((smalltalk.MethodRemoved || MethodRemoved))._new();
-_st($1)._theClass_(self);
 _st($1)._method_(aMethod);
 $2=_st($1)._yourself();
 _st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
 return self}, function($ctx1) {$ctx1.fill(self,"removeCompiledMethod:",{aMethod:aMethod}, smalltalk.Behavior)})},
 args: ["aMethod"],
-source: "removeCompiledMethod: aMethod\x0a\x09self basicRemoveCompiledMethod: aMethod.\x0a    \x0a    SystemAnnouncer current\x0a   \x09\x09announce: (MethodRemoved new\x0a        \x09theClass: self;\x0a            method: aMethod;\x0a            yourself)",
-messageSends: ["basicRemoveCompiledMethod:", "announce:", "theClass:", "new", "method:", "yourself", "current"],
+source: "removeCompiledMethod: aMethod\x0a\x09self basicRemoveCompiledMethod: aMethod.\x0a    \x0a    SystemAnnouncer current\x0a   \x09\x09announce: (MethodRemoved new\x0a            method: aMethod;\x0a            yourself)",
+messageSends: ["basicRemoveCompiledMethod:", "announce:", "method:", "new", "yourself", "current"],
 referencedClasses: ["MethodRemoved", "SystemAnnouncer"]
 }),
 smalltalk.Behavior);

+ 38 - 0
js/Kernel-Objects.deploy.js

@@ -2300,6 +2300,44 @@ smalltalk.Organizer);
 
 
 
+smalltalk.addClass('ClassOrganizer', smalltalk.Organizer, [], 'Kernel-Objects');
+smalltalk.addMethod(
+"_addElement_",
+smalltalk.method({
+selector: "addElement:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Organizer.fn.prototype._addElement_.apply(_st(self), [aString]);
+$1=_st((smalltalk.ProtocolAdded || ProtocolAdded))._new();
+_st($1)._protocol_(aString);
+$2=_st($1)._yourself();
+_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
+return self}, function($ctx1) {$ctx1.fill(self,"addElement:",{aString:aString}, smalltalk.ClassOrganizer)})},
+messageSends: ["addElement:", "announce:", "protocol:", "new", "yourself", "current"]}),
+smalltalk.ClassOrganizer);
+
+smalltalk.addMethod(
+"_removeElement_",
+smalltalk.method({
+selector: "removeElement:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Organizer.fn.prototype._removeElement_.apply(_st(self), [aString]);
+$1=_st((smalltalk.ProtocolRemoved || ProtocolRemoved))._new();
+_st($1)._protocol_(aString);
+$2=_st($1)._yourself();
+_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
+return self}, function($ctx1) {$ctx1.fill(self,"removeElement:",{aString:aString}, smalltalk.ClassOrganizer)})},
+messageSends: ["removeElement:", "announce:", "protocol:", "new", "yourself", "current"]}),
+smalltalk.ClassOrganizer);
+
+
+
+smalltalk.addClass('PackageOrganizer', smalltalk.Organizer, [], 'Kernel-Objects');
+
+
 smalltalk.addClass('Package', smalltalk.Object, ['commitPathJs', 'commitPathSt'], 'Kernel-Objects');
 smalltalk.addMethod(
 "_classes",

+ 48 - 0
js/Kernel-Objects.js

@@ -3185,6 +3185,54 @@ smalltalk.Organizer);
 
 
 
+smalltalk.addClass('ClassOrganizer', smalltalk.Organizer, [], 'Kernel-Objects');
+smalltalk.addMethod(
+"_addElement_",
+smalltalk.method({
+selector: "addElement:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Organizer.fn.prototype._addElement_.apply(_st(self), [aString]);
+$1=_st((smalltalk.ProtocolAdded || ProtocolAdded))._new();
+_st($1)._protocol_(aString);
+$2=_st($1)._yourself();
+_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
+return self}, function($ctx1) {$ctx1.fill(self,"addElement:",{aString:aString}, smalltalk.ClassOrganizer)})},
+args: ["aString"],
+source: "addElement: aString\x0a\x09super addElement: aString.\x0a\x0a\x09SystemAnnouncer current announce: (ProtocolAdded new\x0a    \x09protocol: aString;\x0a        yourself)",
+messageSends: ["addElement:", "announce:", "protocol:", "new", "yourself", "current"],
+referencedClasses: ["ProtocolAdded", "SystemAnnouncer"]
+}),
+smalltalk.ClassOrganizer);
+
+smalltalk.addMethod(
+"_removeElement_",
+smalltalk.method({
+selector: "removeElement:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Organizer.fn.prototype._removeElement_.apply(_st(self), [aString]);
+$1=_st((smalltalk.ProtocolRemoved || ProtocolRemoved))._new();
+_st($1)._protocol_(aString);
+$2=_st($1)._yourself();
+_st(_st((smalltalk.SystemAnnouncer || SystemAnnouncer))._current())._announce_($2);
+return self}, function($ctx1) {$ctx1.fill(self,"removeElement:",{aString:aString}, smalltalk.ClassOrganizer)})},
+args: ["aString"],
+source: "removeElement: aString\x0a\x09super removeElement: aString.\x0a\x0a\x09SystemAnnouncer current announce: (ProtocolRemoved new\x0a    \x09protocol: aString;\x0a        yourself)",
+messageSends: ["removeElement:", "announce:", "protocol:", "new", "yourself", "current"],
+referencedClasses: ["ProtocolRemoved", "SystemAnnouncer"]
+}),
+smalltalk.ClassOrganizer);
+
+
+
+smalltalk.addClass('PackageOrganizer', smalltalk.Organizer, [], 'Kernel-Objects');
+
+
 smalltalk.addClass('Package', smalltalk.Object, ['commitPathJs', 'commitPathSt'], 'Kernel-Objects');
 smalltalk.Package.comment="A Package is similar to a \x22class category\x22 typically found in other Smalltalks like Pharo or Squeak. Amber does not have class categories anymore, it had in the beginning but now each class in the system knows which package it belongs to.\x0a\x0aA Package has a name, an Array of \x22requires\x22, a comment and a Dictionary with other optional key value attributes. A Package can also be queried for its classes, but it will then resort to a reverse scan of all classes to find them.\x0aPackages are manipulated through \x22Smalltalk current\x22, like for example finding one based on a name:\x0a\x0a\x09Smalltalk current packageAt: 'Kernel'\x0a\x0a...but you can also use:\x0a\x0a\x09Package named: 'Kernel'\x0a\x0aA Package differs slightly from a Monticello package which can span multiple class categories using a naming convention based on hyphenation. But just as in Monticello a Package supports \x22class extensions\x22 so a Package\x0acan define behaviors in foreign classes using a naming convention for method categories where the category starts with an asterisk and then the name of the owning package follows. This can easily be seen in for example class\x0aString where the method category \x22*IDE\x22 defines #inspectOn: which thus is a method belonging to the IDE package.\x0a\x0aYou can fetch a package from the server:\x0a\x0a\x09Package fetch: 'Additional-Examples'"
 smalltalk.addMethod(

+ 6 - 1
js/boot.js

@@ -75,6 +75,9 @@ function SmalltalkSymbol(string) {
 	this.value = string;
 }
 function SmalltalkOrganizer() {
+}
+
+function SmalltalkPackageOrganizer() {
     this.elements = [];
 }
 
@@ -96,6 +99,7 @@ inherits(SmalltalkNil, SmalltalkObject);
 inherits(SmalltalkMethod, SmalltalkObject);
 inherits(SmalltalkPackage, SmalltalkObject);
 inherits(SmalltalkOrganizer, SmalltalkObject);
+inherits(SmalltalkPackageOrganizer, SmalltalkOrganizer);
 inherits(SmalltalkClassOrganizer, SmalltalkOrganizer);
 
 
@@ -189,7 +193,7 @@ function Smalltalk() {
 	function pkg(spec) {
 		var that = new SmalltalkPackage();
 		that.pkgName = spec.pkgName;
-        that.organization = new SmalltalkOrganizer();
+        that.organization = new SmalltalkPackageOrganizer();
 		that.properties = spec.properties || {};
 		return that;
 	}
@@ -818,6 +822,7 @@ smalltalk.wrapClassName("Smalltalk", "Kernel-Objects", Smalltalk, smalltalk.Obje
 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);
 
 

+ 63 - 5
st/Kernel-Announcements.st

@@ -103,34 +103,48 @@ theClass: aClass
 	theClass := aClass
 ! !
 
-SystemAnnouncement subclass: #ClassAdded
+SystemAnnouncement subclass: #ClassAnnouncement
+	instanceVariableNames: 'theClass'
+	package: 'Kernel-Announcements'!
+
+!ClassAnnouncement methodsFor: 'accessing'!
+
+theClass
+	^ theClass
+!
+
+theClass: aClass
+	theClass := aClass
+! !
+
+ClassAnnouncement subclass: #ClassAdded
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!
 !ClassAdded commentStamp!
 I am emitted when a class is added to the system.
 See ClassBuilder >> #addSubclassOf:... methods!
 
-SystemAnnouncement subclass: #ClassCommentChanged
+ClassAnnouncement subclass: #ClassCommentChanged
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!
 !ClassCommentChanged commentStamp!
 I am emitted when the comment of a class changes. (Behavior >> #comment)!
 
-SystemAnnouncement subclass: #ClassDefinitionChanged
+ClassAnnouncement subclass: #ClassDefinitionChanged
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!
 !ClassDefinitionChanged commentStamp!
 I am emitted when the defintion of a class changes.
 See ClassBuilder >> #class:instanceVariableNames:!
 
-SystemAnnouncement subclass: #ClassRemoved
+ClassAnnouncement subclass: #ClassRemoved
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!
 !ClassRemoved commentStamp!
 I am emitted when a class is removed.
 See Smalltalk >> #removeClass:!
 
-SystemAnnouncement subclass: #ClassRenamed
+ClassAnnouncement subclass: #ClassRenamed
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!
 !ClassRenamed commentStamp!
@@ -173,3 +187,47 @@ MethodAnnouncement subclass: #MethodRemoved
 	instanceVariableNames: ''
 	package: 'Kernel-Announcements'!
 
+SystemAnnouncement subclass: #PackageAnnouncement
+	instanceVariableNames: 'package'
+	package: 'Kernel-Announcements'!
+
+!PackageAnnouncement methodsFor: 'accessing'!
+
+package
+	^ package
+!
+
+package: aPackage
+	package := aPackage
+! !
+
+PackageAnnouncement subclass: #PackageAdded
+	instanceVariableNames: ''
+	package: 'Kernel-Announcements'!
+
+PackageAnnouncement subclass: #PackageRemoved
+	instanceVariableNames: ''
+	package: 'Kernel-Announcements'!
+
+SystemAnnouncement subclass: #ProtocolAnnouncement
+	instanceVariableNames: 'protocol'
+	package: 'Kernel-Announcements'!
+
+!ProtocolAnnouncement methodsFor: 'accessing'!
+
+protocol
+	^ protocol
+!
+
+protocol: aString
+	protocol := aString
+! !
+
+ProtocolAnnouncement subclass: #ProtocolAdded
+	instanceVariableNames: ''
+	package: 'Kernel-Announcements'!
+
+ProtocolAnnouncement subclass: #ProtocolRemoved
+	instanceVariableNames: ''
+	package: 'Kernel-Announcements'!
+

+ 0 - 3
st/Kernel-Classes.st

@@ -185,12 +185,10 @@ addCompiledMethod: aMethod
     announcement := oldMethod 
     	ifNil: [
 		    MethodAdded new
-       			 	theClass: self;
 		            method: aMethod;
        			    yourself ]
     	ifNotNil: [
           	MethodModified new
-       			 	theClass: self;
                     oldMethod: oldMethod; 
 		            method: aMethod;
        			    yourself ].
@@ -215,7 +213,6 @@ removeCompiledMethod: aMethod
     
     SystemAnnouncer current
    		announce: (MethodRemoved new
-        	theClass: self;
             method: aMethod;
             yourself)
 ! !

+ 26 - 0
st/Kernel-Objects.st

@@ -1062,6 +1062,32 @@ removeElement: anObject
 	<self.elements.removeElement(anObject)>
 ! !
 
+Organizer subclass: #ClassOrganizer
+	instanceVariableNames: ''
+	package: 'Kernel-Objects'!
+
+!ClassOrganizer methodsFor: 'accessing'!
+
+addElement: aString
+	super addElement: aString.
+
+	SystemAnnouncer current announce: (ProtocolAdded new
+    	protocol: aString;
+        yourself)
+!
+
+removeElement: aString
+	super removeElement: aString.
+
+	SystemAnnouncer current announce: (ProtocolRemoved new
+    	protocol: aString;
+        yourself)
+! !
+
+Organizer subclass: #PackageOrganizer
+	instanceVariableNames: ''
+	package: 'Kernel-Objects'!
+
 Object subclass: #Package
 	instanceVariableNames: 'commitPathJs commitPathSt'
 	package: 'Kernel-Objects'!