// Basic plugin structure abstract class PluginApi { public function __construct() { // Register ourselves at Core core::getInstance()->registerPlugin($this); } /* Observer-Pattern */ abstract public function update(); } // Some concrete plugin class SuperPlugin extends PluginApi { public function update() { // ... } } new SuperPlugin(); // Application core class Core { private static $instance; /* Constructor */ public function __construct() { self::$instance = $this; } /* Singleton pattern */ public static function getInstance() { if (! self::$instance) { return new core(); } return self::$instance; } /* Init idiom */ private function init() { } /* Observer-Pattern */ public function registerPlugin(& $pPlugin) { $this->plugins[] =& $pPlugin; } protected function notify() { foreach($this->plugins as $observer) { $observer->update(); } } }