I'm looking for the best practice to loosely couple modules in my app. Basically I'll have a core and a number of modules that should all be optional and exchangeable. The core should not have any knowledge of them and no core files should have to be modified to add a module.

Modules should be able to hook into the menu(s), partials in core templates (sidebar) and ultimately into core forms.

Specifically I'm using a MVC framework (Django), but it's really the theory I'm interesting in. Is there a design pattern that fits here or are there some good code out there that serves as an example?