Usually, I like to have the shell be the plumber, but then let the modules communicate amongst themselves.
If you haven't already, check out this slide from the presentation on MultiCore where I describe various module communication architectures.
http://puremvc.tv/#P002/T235-=Cliff>