On 10 Sep 2015, at 19:44, Ben Coman <btc@openInWorld.com> wrote:
On Fri, Sep 11, 2015 at 12:43 AM, Max Leske <maxleske@gmail.com <mailto:maxleske@gmail.com>> wrote:
On 10 Sep 2015, at 17:22, Ben Coman <btc@openInWorld.com> wrote:
The bootstrap-dependency graph and report [1] mark dependency System-Announcements --> PragmaCollector for pruning. This is due to...
SystemAnnouncer>>restoreAllNotifications | collector | self reset. collector := PragmaCollector filter: [ :pragma | pragma keyword = #systemEventRegistration ]. collector reset. collector do: [ :pragma | pragma methodClass theNonMetaClass perform: pragma selector ]
Browsing around I came to understand that PragmaCollector is useful as a pragma cache, but here the collector is thrown away, so that facility is not needed. A key part is "collector reset" which does... self class allSystemPragmas do: [:pragma | self addPragma: pragma]
where the #addPragma: evaluates the initialize'd #filter: block. Now it seems that #allSystemPragmas might fit nicely on Pragma rather than PragmaCollector such that the following should be equivalent...
SystemAnnouncer>>restoreAllNotifications | systemPragmas | self reset. systemPragmas := Pragma allSystemPragmas collect: [ :pragma | pragma keyword = #systemEventRegistration ]. systemPragmas do: [ :pragma | pragma methodClass theNonMetaClass perform: pragma selector
Cool. I like that better.
However #allSystemPragmas depends on SystemNavigation, so is it be okay for Pragma to depend on SystemNavigation?
Spontaneously Iâd say that SystemNavigation should depend on Pragma or PragmaCollector for looking up pragmas, not the other way around.
So you mean something like...
SystemAnnouncer>>restoreAllNotifications self reset. SystemNavigation allPragmasNamed: #systemEventRegistration do: [ :pragma | pragma methodClass theNonMetaClass perform: pragma selector ].
where...
SystemNavigation>>allPragmasNamed: symbol do: aBlock | systemPragmas | systemPragmas := self allSystemPragmas collect: [ :pragma | pragma keyword = symbol ]. systemPragmas do: [ :pragma | pragma methodClass theNonMetaClass perform: pragma selector
SystemNavigation>>allSystemPragmas ^ (Array streamContents: [:stream | self allBehaviorsDo: [:behavior | Pragma withPragmasIn: behavior do: [:pragma | stream nextPut: pragma]]])
Yes, exactly.
cheers -ben
Actually, class side of Pragma has several #named:in: like methods, so something like the following would be neat... SystemAnnouncer>>restoreAllNotifications self reset. Pragma allNamed: #systemEventRegistration do: [ :pragma | pragma methodClass theNonMetaClass perform: pragma selector ].