title: How to design extensible software (plugin architecture)?
body: <p>I need some resources that talk about how to design your software to be extensible, i.e. so that other people can write add-ons/plug-ins that adds functionality to it.</p>
  
  <p>What do you recommend? Any books out there that discuss the subject?<br>
  I would prefer something that's short and to the point; a bit of theory and a bunch of concrete examples.</p>
  
  <p>I'm not targeting a specific language, I want to be able to understand the core idea so that I can implement it in any language.  </p>
  
  <p>And for the same reason, I prefer not to do it using a framework that someone else built (unless the framework is not very high-level, i.e. doesn't hide <em>too</em> much), at the moment I only want to educate myself on the subject and experiment with various ways to implement it. Plus, a framework usually assumes user's knowledge about the subject.</p>
  
  <p><strong>UPDATE</strong></p>
  
  <p>I'm not asking about OOP or allowing my classes to be inherited. I'm talking about designing an application that will be deployed on a system, such that it can be extended by third-party add-ons AFTER its been deployed.</p>
  
  <p>For example, Notepad++ has a plug-in architecture where you can place a .dll file in the plugins folder, and it adds functionality to the application that wasn't there, such as color-picking, or snippet insertion, or many other things (a wide range of functionality).</p>