I am checking out on the basics of the PluggableTextMorph and PluggableListMorph .. and its cousins.
PluggableListMorph >> changeModelSelection: anInteger setIndexSelector ifNotNil: [model perform: setIndexSelector with: anInteger]. here it is the responsibility of the model to send #changed: getIndexSelector. why..? why not a simpler generic: changeModelSelection: anInteger setIndexSelector ifNotNil: [model perform: setIndexSelector with: anInteger]. "sends the call to all dependents of the model implicitly" * model perform: #changed: with: getIndexSelector * thereof the models anywhere need not bother sending #changed: calls... ! similarly: acceptTextInModel ..... [^setTextSelector isNil or: [setTextSelector numArgs = 2 ifTrue: [model perform: setTextSelector with: acceptedText with: self] ifFalse: [model perform: setTextSelector with: acceptedText]] ] ensure: [unstyledAcceptText := nil]. * model perform: #changed with: getTextSelector* *We can avoid these in the methods if implemented across all Pluggable??Morphs * Workspace class>> openContents: aString ^ self new open; contents: aString; "funny is this itself calls #changed:" "changed: #contents;" yourself Makes common sense to me.. rather than expecting the model to explicity call #changed:..this "view" / widget knows its model and it implicitly invoking #changed: is cleaner abstraction, unless a use case exists which may break infrastructure/ whole base doing this.. This way all models associated with various Pluggable??Morphs will work perfectly fine on just a setter call without extra line being added everywhere in the application code, apps need to bother about changes to other symbol viz: updating a list selection index causes another widget to refresh its content..