Ver código fonte

Refactoring anAssociation out.

Herbert Vojčík 12 anos atrás
pai
commit
9e4ded4119
3 arquivos alterados com 143 adições e 138 exclusões
  1. 47 46
      js/Canvas.deploy.js
  2. 71 70
      js/Canvas.js
  3. 25 22
      st/Canvas.st

+ 47 - 46
js/Canvas.deploy.js

@@ -1568,30 +1568,6 @@ smalltalk.HTMLCanvas.klass);
 
 
 smalltalk.addClass('HTMLSnippet', smalltalk.Object, ['snippets'], 'Canvas');
-smalltalk.addMethod(
-"_addSnippet_",
-smalltalk.method({
-selector: "addSnippet:",
-fn: function (anAssociation){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._snippets())._add_(anAssociation);
-return self}, function($ctx1) {$ctx1.fill(self,"addSnippet:",{anAssociation:anAssociation}, smalltalk.HtmlSnippet)})}
-}),
-smalltalk.HTMLSnippet);
-
-smalltalk.addMethod(
-"_compileSnippet_",
-smalltalk.method({
-selector: "compileSnippet:",
-fn: function (anAssociation){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.ClassBuilder || ClassBuilder))._new())._installMethod_forClass_category_(_st(_st((function(htmlReceiver){
-return smalltalk.withContext(function($ctx2) {
return _st(htmlReceiver)._snippet_(_st(anAssociation)._value());
-}, function($ctx2) {$ctx2.fillBlock({htmlReceiver:htmlReceiver},$ctx1)})}))._currySelf())._asCompiledMethod_(_st(anAssociation)._key()),(smalltalk.HTMLCanvas || HTMLCanvas),"**snippets");
-return self}, function($ctx1) {$ctx1.fill(self,"compileSnippet:",{anAssociation:anAssociation}, smalltalk.HtmlSnippet)})}
-}),
-smalltalk.HTMLSnippet);
-
 smalltalk.addMethod(
 "_initializeFromJQuery_",
 smalltalk.method({
@@ -1605,20 +1581,6 @@ return self}, function($ctx1) {$ctx1.fill(self,"initializeFromJQuery:",{aJQuery:
 }),
 smalltalk.HTMLSnippet);
 
-smalltalk.addMethod(
-"_installSnippet_",
-smalltalk.method({
-selector: "installSnippet:",
-fn: function (anAssociation){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-$1=self;
-_st($1)._addSnippet_(anAssociation);
-$2=_st($1)._compileSnippet_(anAssociation);
-return self}, function($ctx1) {$ctx1.fill(self,"installSnippet:",{anAssociation:anAssociation}, smalltalk.HtmlSnippet)})}
-}),
-smalltalk.HTMLSnippet);
-
 smalltalk.addMethod(
 "_installSnippetFromJQuery_",
 smalltalk.method({
@@ -1638,9 +1600,9 @@ _st(element)._attr_put_("data-snippet","*");
 } else {
 _st(element)._removeAttr_("data-snippet");
 };
-_st(self)._installSnippet_(_st(name).__minus_gt(_st(_st(element)._detach())._get_((0))));
+_st(self)._snippetAt_install_(name,_st(_st(element)._detach())._get_((0)));
 };
-return self}, function($ctx1) {$ctx1.fill(self,"installSnippetFromJQuery:",{element:element,name:name}, smalltalk.HtmlSnippet)})}
+return self}, function($ctx1) {$ctx1.fill(self,"installSnippetFromJQuery:",{element:element,name:name}, smalltalk.HTMLSnippet)})}
 }),
 smalltalk.HTMLSnippet);
 
@@ -1651,9 +1613,22 @@ selector: "snippetAt:",
 fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self["@snippets"])._at_(aString);
+$1=_st(_st(self)._snippets())._at_(aString);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"snippetAt:",{aString:aString}, smalltalk.HtmlSnippet)})}
+}, function($ctx1) {$ctx1.fill(self,"snippetAt:",{aString:aString}, smalltalk.HTMLSnippet)})}
+}),
+smalltalk.HTMLSnippet);
+
+smalltalk.addMethod(
+"_snippetAt_compile_",
+smalltalk.method({
+selector: "snippetAt:compile:",
+fn: function (aString,anElement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.ClassBuilder || ClassBuilder))._new())._installMethod_forClass_category_(_st(_st((function(htmlReceiver){
+return smalltalk.withContext(function($ctx2) {
return _st(htmlReceiver)._snippet_(anElement);
+}, function($ctx2) {$ctx2.fillBlock({htmlReceiver:htmlReceiver},$ctx1)})}))._currySelf())._asCompiledMethod_(aString),(smalltalk.HTMLCanvas || HTMLCanvas),"**snippets");
+return self}, function($ctx1) {$ctx1.fill(self,"snippetAt:compile:",{aString:aString,anElement:anElement}, smalltalk.HTMLSnippet)})}
 }),
 smalltalk.HTMLSnippet);
 
@@ -1664,9 +1639,34 @@ selector: "snippetAt:ifAbsent:",
 fn: function (aString,aBlock){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self["@snippets"])._at_ifAbsent_(aString,aBlock);
+$1=_st(_st(self)._snippets())._at_ifAbsent_(aString,aBlock);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"snippetAt:ifAbsent:",{aString:aString,aBlock:aBlock}, smalltalk.HtmlSnippet)})}
+}, function($ctx1) {$ctx1.fill(self,"snippetAt:ifAbsent:",{aString:aString,aBlock:aBlock}, smalltalk.HTMLSnippet)})}
+}),
+smalltalk.HTMLSnippet);
+
+smalltalk.addMethod(
+"_snippetAt_install_",
+smalltalk.method({
+selector: "snippetAt:install:",
+fn: function (aString,anElement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=self;
+_st($1)._snippetAt_put_(aString,anElement);
+$2=_st($1)._snippetAt_compile_(aString,anElement);
+return self}, function($ctx1) {$ctx1.fill(self,"snippetAt:install:",{aString:aString,anElement:anElement}, smalltalk.HTMLSnippet)})}
+}),
+smalltalk.HTMLSnippet);
+
+smalltalk.addMethod(
+"_snippetAt_put_",
+smalltalk.method({
+selector: "snippetAt:put:",
+fn: function (aString,anElement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._snippets())._at_put_(aString,anElement);
+return self}, function($ctx1) {$ctx1.fill(self,"snippetAt:put:",{aString:aString,anElement:anElement}, smalltalk.HTMLSnippet)})}
 }),
 smalltalk.HTMLSnippet);
 
@@ -1744,8 +1744,9 @@ smalltalk.method({
 selector: "initialize",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._ensureCurrent();
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HtmlSnippet.klass)})}
+return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.klass.fn.prototype._initialize.apply(_st(self), []);
+_st(self)._ensureCurrent();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HTMLSnippet.klass)})}
 }),
 smalltalk.HTMLSnippet.klass);
 

+ 71 - 70
js/Canvas.js

@@ -2164,40 +2164,6 @@ smalltalk.HTMLCanvas.klass);
 
 smalltalk.addClass('HTMLSnippet', smalltalk.Object, ['snippets'], 'Canvas');
 smalltalk.HTMLSnippet.comment="HTMLSnippet instance is the registry of html snippets.\x0aHTMLSnippet current is the public singleton instance.\x0a\x0aAt the beginning, it scans the document for any html elements\x0awith 'data-snippet=\x22foo\x22' attribute and takes them off the document,\x0aremembering them in the store under the specified name.\x0aIt also install method #foo into HTMLCanvas dynamically.\x0a\x0aEvery html snippet should mark a 'caret', a place where contents\x0acan be inserted, by 'data-snippet=\x22*\x22' (a special name for caret).\x0aFor example:\x0a\x0a<li data-snippet='menuelement' class='...'><a data-snippet='*'></a></li>\x0a\x0adefines a list element with a link inside; the link itself is marked as a caret.\x0a\x0aYou can later issue\x0a\x0ahtml menuelement href: '/foo'; with: 'A foo'\x0a\x0ato insert the whole snippet and directly manipulate the caret, so it renders:\x0a\x0a<li class='...'><a href='/foo'>A foo</a></li>\x0a\x0aFor a self-careting tags (not very useful, but you do not need to fill class etc.\x0ayou can use\x0a\x0a<div class='lots of classes' attr1='one' attr2='two' data-snippet='*bar'></div>\x0a\x0aand in code later do:\x0a\x0ahtml bar with: [ xxx ]\x0a\x0ato render\x0a\x0a<div class='lots of classes' attr1='one' attr2='two'>...added by xxx...</div>\x0a"
-smalltalk.addMethod(
-"_addSnippet_",
-smalltalk.method({
-selector: "addSnippet:",
-category: 'accessing',
-fn: function (anAssociation){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._snippets())._add_(anAssociation);
-return self}, function($ctx1) {$ctx1.fill(self,"addSnippet:",{anAssociation:anAssociation}, smalltalk.HtmlSnippet)})},
-args: ["anAssociation"],
-source: "addSnippet: anAssociation\x0a\x09self snippets add: anAssociation",
-messageSends: ["add:", "snippets"],
-referencedClasses: []
-}),
-smalltalk.HTMLSnippet);
-
-smalltalk.addMethod(
-"_compileSnippet_",
-smalltalk.method({
-selector: "compileSnippet:",
-category: 'method generation',
-fn: function (anAssociation){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.ClassBuilder || ClassBuilder))._new())._installMethod_forClass_category_(_st(_st((function(htmlReceiver){
-return smalltalk.withContext(function($ctx2) {
return _st(htmlReceiver)._snippet_(_st(anAssociation)._value());
-}, function($ctx2) {$ctx2.fillBlock({htmlReceiver:htmlReceiver},$ctx1)})}))._currySelf())._asCompiledMethod_(_st(anAssociation)._key()),(smalltalk.HTMLCanvas || HTMLCanvas),"**snippets");
-return self}, function($ctx1) {$ctx1.fill(self,"compileSnippet:",{anAssociation:anAssociation}, smalltalk.HtmlSnippet)})},
-args: ["anAssociation"],
-source: "compileSnippet: anAssociation\x0a\x09\x22Method generation the the snippet.\x0a    The selector is the key of anAssociation, the method block being the value of anAssociation\x22\x0a    \x0a    ClassBuilder new\x0a    \x09installMethod: ([ :htmlReceiver | htmlReceiver snippet: anAssociation value ] \x0a        \x09currySelf asCompiledMethod: anAssociation key)\x0a        forClass: HTMLCanvas\x0a        category: '**snippets'",
-messageSends: ["installMethod:forClass:category:", "asCompiledMethod:", "key", "currySelf", "snippet:", "value", "new"],
-referencedClasses: ["HTMLCanvas", "ClassBuilder"]
-}),
-smalltalk.HTMLSnippet);
-
 smalltalk.addMethod(
 "_initializeFromJQuery_",
 smalltalk.method({
@@ -2216,25 +2182,6 @@ referencedClasses: []
 }),
 smalltalk.HTMLSnippet);
 
-smalltalk.addMethod(
-"_installSnippet_",
-smalltalk.method({
-selector: "installSnippet:",
-category: 'snippet installation',
-fn: function (anAssociation){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2;
-$1=self;
-_st($1)._addSnippet_(anAssociation);
-$2=_st($1)._compileSnippet_(anAssociation);
-return self}, function($ctx1) {$ctx1.fill(self,"installSnippet:",{anAssociation:anAssociation}, smalltalk.HtmlSnippet)})},
-args: ["anAssociation"],
-source: "installSnippet: anAssociation\x0a\x09self \x0a    \x09addSnippet: anAssociation;\x0a        compileSnippet: anAssociation",
-messageSends: ["addSnippet:", "compileSnippet:"],
-referencedClasses: []
-}),
-smalltalk.HTMLSnippet);
-
 smalltalk.addMethod(
 "_installSnippetFromJQuery_",
 smalltalk.method({
@@ -2255,12 +2202,12 @@ _st(element)._attr_put_("data-snippet","*");
 } else {
 _st(element)._removeAttr_("data-snippet");
 };
-_st(self)._installSnippet_(_st(name).__minus_gt(_st(_st(element)._detach())._get_((0))));
+_st(self)._snippetAt_install_(name,_st(_st(element)._detach())._get_((0)));
 };
-return self}, function($ctx1) {$ctx1.fill(self,"installSnippetFromJQuery:",{element:element,name:name}, smalltalk.HtmlSnippet)})},
+return self}, function($ctx1) {$ctx1.fill(self,"installSnippetFromJQuery:",{element:element,name:name}, smalltalk.HTMLSnippet)})},
 args: ["element"],
-source: "installSnippetFromJQuery: element\x0a\x09| name |\x0a    name := element attr: 'data-snippet'.\x0a    name = '*' ifFalse: [\x0a    \x09('^\x5c*' asRegexp test: name) \x0a            ifTrue: [ \x0a            \x09name := name allButFirst. \x0a                element attr: 'data-snippet' put: '*' ]\x0a          \x09ifFalse: [ \x0a            \x09element removeAttr: 'data-snippet' ].\x0a        self installSnippet: name -> (element detach get: 0) ]",
-messageSends: ["attr:", "ifFalse:", "ifTrue:ifFalse:", "allButFirst", "attr:put:", "removeAttr:", "test:", "asRegexp", "installSnippet:", "->", "get:", "detach", "="],
+source: "installSnippetFromJQuery: element\x0a\x09| name |\x0a    name := element attr: 'data-snippet'.\x0a    name = '*' ifFalse: [\x0a    \x09('^\x5c*' asRegexp test: name) \x0a            ifTrue: [ \x0a            \x09name := name allButFirst. \x0a                element attr: 'data-snippet' put: '*' ]\x0a          \x09ifFalse: [ \x0a            \x09element removeAttr: 'data-snippet' ].\x0a        self snippetAt: name install: (element detach get: 0) ]",
+messageSends: ["attr:", "ifFalse:", "ifTrue:ifFalse:", "allButFirst", "attr:put:", "removeAttr:", "test:", "asRegexp", "snippetAt:install:", "get:", "detach", "="],
 referencedClasses: []
 }),
 smalltalk.HTMLSnippet);
@@ -2273,16 +2220,34 @@ category: 'accessing',
 fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self["@snippets"])._at_(aString);
+$1=_st(_st(self)._snippets())._at_(aString);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"snippetAt:",{aString:aString}, smalltalk.HtmlSnippet)})},
+}, function($ctx1) {$ctx1.fill(self,"snippetAt:",{aString:aString}, smalltalk.HTMLSnippet)})},
 args: ["aString"],
-source: "snippetAt: aString\x0a\x09^ snippets at: aString",
-messageSends: ["at:"],
+source: "snippetAt: aString\x0a\x09^ self snippets at: aString",
+messageSends: ["at:", "snippets"],
 referencedClasses: []
 }),
 smalltalk.HTMLSnippet);
 
+smalltalk.addMethod(
+"_snippetAt_compile_",
+smalltalk.method({
+selector: "snippetAt:compile:",
+category: 'method generation',
+fn: function (aString,anElement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.ClassBuilder || ClassBuilder))._new())._installMethod_forClass_category_(_st(_st((function(htmlReceiver){
+return smalltalk.withContext(function($ctx2) {
return _st(htmlReceiver)._snippet_(anElement);
+}, function($ctx2) {$ctx2.fillBlock({htmlReceiver:htmlReceiver},$ctx1)})}))._currySelf())._asCompiledMethod_(aString),(smalltalk.HTMLCanvas || HTMLCanvas),"**snippets");
+return self}, function($ctx1) {$ctx1.fill(self,"snippetAt:compile:",{aString:aString,anElement:anElement}, smalltalk.HTMLSnippet)})},
+args: ["aString", "anElement"],
+source: "snippetAt: aString compile: anElement\x0a\x09\x22Method generation for the snippet.\x0a    The selector is aString, the method block uses anElement\x22\x0a    \x0a    ClassBuilder new\x0a    \x09installMethod: ([ :htmlReceiver | htmlReceiver snippet: anElement ] \x0a        \x09currySelf asCompiledMethod: aString)\x0a        forClass: HTMLCanvas\x0a        category: '**snippets'",
+messageSends: ["installMethod:forClass:category:", "asCompiledMethod:", "currySelf", "snippet:", "new"],
+referencedClasses: ["HTMLCanvas", "ClassBuilder"]
+}),
+smalltalk.HTMLSnippet);
+
 smalltalk.addMethod(
 "_snippetAt_ifAbsent_",
 smalltalk.method({
@@ -2291,12 +2256,47 @@ category: 'accessing',
 fn: function (aString,aBlock){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(self["@snippets"])._at_ifAbsent_(aString,aBlock);
+$1=_st(_st(self)._snippets())._at_ifAbsent_(aString,aBlock);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"snippetAt:ifAbsent:",{aString:aString,aBlock:aBlock}, smalltalk.HtmlSnippet)})},
+}, function($ctx1) {$ctx1.fill(self,"snippetAt:ifAbsent:",{aString:aString,aBlock:aBlock}, smalltalk.HTMLSnippet)})},
 args: ["aString", "aBlock"],
-source: "snippetAt: aString ifAbsent: aBlock\x0a\x09^ snippets at: aString ifAbsent: aBlock",
-messageSends: ["at:ifAbsent:"],
+source: "snippetAt: aString ifAbsent: aBlock\x0a\x09^ self snippets at: aString ifAbsent: aBlock",
+messageSends: ["at:ifAbsent:", "snippets"],
+referencedClasses: []
+}),
+smalltalk.HTMLSnippet);
+
+smalltalk.addMethod(
+"_snippetAt_install_",
+smalltalk.method({
+selector: "snippetAt:install:",
+category: 'snippet installation',
+fn: function (aString,anElement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=self;
+_st($1)._snippetAt_put_(aString,anElement);
+$2=_st($1)._snippetAt_compile_(aString,anElement);
+return self}, function($ctx1) {$ctx1.fill(self,"snippetAt:install:",{aString:aString,anElement:anElement}, smalltalk.HTMLSnippet)})},
+args: ["aString", "anElement"],
+source: "snippetAt: aString install: anElement\x0a\x09self \x0a    \x09snippetAt: aString put: anElement;\x0a        snippetAt: aString compile: anElement",
+messageSends: ["snippetAt:put:", "snippetAt:compile:"],
+referencedClasses: []
+}),
+smalltalk.HTMLSnippet);
+
+smalltalk.addMethod(
+"_snippetAt_put_",
+smalltalk.method({
+selector: "snippetAt:put:",
+category: 'accessing',
+fn: function (aString,anElement){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._snippets())._at_put_(aString,anElement);
+return self}, function($ctx1) {$ctx1.fill(self,"snippetAt:put:",{aString:aString,anElement:anElement}, smalltalk.HTMLSnippet)})},
+args: ["aString", "anElement"],
+source: "snippetAt: aString put: anElement\x0a\x09self snippets at: aString put: anElement",
+messageSends: ["at:put:", "snippets"],
 referencedClasses: []
 }),
 smalltalk.HTMLSnippet);
@@ -2329,7 +2329,7 @@ smalltalk.addMethod(
 "_snippetsFromJQuery_",
 smalltalk.method({
 selector: "snippetsFromJQuery:",
-category: 'accessing',
+category: 'private',
 fn: function (aJQuery){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
@@ -2396,11 +2396,12 @@ selector: "initialize",
 category: 'initialization',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._ensureCurrent();
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HtmlSnippet.klass)})},
+return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.klass.fn.prototype._initialize.apply(_st(self), []);
+_st(self)._ensureCurrent();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HTMLSnippet.klass)})},
 args: [],
-source: "initialize\x0a\x09self ensureCurrent",
-messageSends: ["ensureCurrent"],
+source: "initialize\x0a\x09super initialize.\x0a\x09self ensureCurrent",
+messageSends: ["initialize", "ensureCurrent"],
 referencedClasses: []
 }),
 smalltalk.HTMLSnippet.klass);

+ 25 - 22
st/Canvas.st

@@ -548,24 +548,20 @@ to render
 
 !HTMLSnippet methodsFor: 'accessing'!
 
-addSnippet: anAssociation
-	self snippets add: anAssociation
-!
-
 snippetAt: aString
-	^ snippets at: aString
+	^ self snippets at: aString
 !
 
 snippetAt: aString ifAbsent: aBlock
-	^ snippets at: aString ifAbsent: aBlock
+	^ self snippets at: aString ifAbsent: aBlock
 !
 
-snippets
-	^snippets ifNil: [ snippets := #{} ]
+snippetAt: aString put: anElement
+	self snippets at: aString put: anElement
 !
 
-snippetsFromJQuery: aJQuery
-	^ (aJQuery find: '[data-snippet]') toArray
+snippets
+	^snippets ifNil: [ snippets := #{} ]
 ! !
 
 !HTMLSnippet methodsFor: 'initialization'!
@@ -580,24 +576,24 @@ initializeFromJQuery: aJQuery
 
 !HTMLSnippet methodsFor: 'method generation'!
 
-compileSnippet: anAssociation
-	"Method generation the the snippet.
-    The selector is the key of anAssociation, the method block being the value of anAssociation"
+snippetAt: aString compile: anElement
+	"Method generation for the snippet.
+    The selector is aString, the method block uses anElement"
     
     ClassBuilder new
-    	installMethod: ([ :htmlReceiver | htmlReceiver snippet: anAssociation value ] 
-        	currySelf asCompiledMethod: anAssociation key)
+    	installMethod: ([ :htmlReceiver | htmlReceiver snippet: anElement ] 
+        	currySelf asCompiledMethod: aString)
         forClass: HTMLCanvas
         category: '**snippets'
 ! !
 
-!HTMLSnippet methodsFor: 'snippet installation'!
+!HTMLSnippet methodsFor: 'private'!
 
-installSnippet: anAssociation
-	self 
-    	addSnippet: anAssociation;
-        compileSnippet: anAssociation
-!
+snippetsFromJQuery: aJQuery
+	^ (aJQuery find: '[data-snippet]') toArray
+! !
+
+!HTMLSnippet methodsFor: 'snippet installation'!
 
 installSnippetFromJQuery: element
 	| name |
@@ -609,7 +605,13 @@ installSnippetFromJQuery: element
                 element attr: 'data-snippet' put: '*' ]
           	ifFalse: [ 
             	element removeAttr: 'data-snippet' ].
-        self installSnippet: name -> (element detach get: 0) ]
+        self snippetAt: name install: (element detach get: 0) ]
+!
+
+snippetAt: aString install: anElement
+	self 
+    	snippetAt: aString put: anElement;
+        snippetAt: aString compile: anElement
 ! !
 
 HTMLSnippet class instanceVariableNames: 'current'!
@@ -624,6 +626,7 @@ ensureCurrent
 !
 
 initialize
+	super initialize.
 	self ensureCurrent
 ! !