From e842bd07d5bcb07c236b970d1c91c8b101753b0e Mon Sep 17 00:00:00 2001
From: Chris Smith <chris.eureka@jalakai.co.uk>
Date: Wed, 11 Feb 2009 15:35:20 +0100
Subject: [PATCH] Fix for FS#1598  - allow a plugin to be a singleton if it so
 desires

DokuWiki typically instantiates a plugin once and reuses
that instance whenever the plugin is required. However on
some occasions DokuWiki will request a new instantiation of
a plugin.  This particularly applies to render plugins.  This
patch allows a plugin to force DokuWiki to reuse the existing
instance.

If a plugin wishes to only be instantiated once then it
should implement an "isSingleton()" method and that
method should return boolean true.

darcs-hash:20090211143520-f07c6-5c1a33dbed55f0b196a204745fe3139f3c7c0aa9.gz
---
 inc/plugin.php                 | 9 +++++++++
 inc/plugincontroller.class.php | 2 +-
 lib/plugins/syntax.php         | 8 ++++++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/inc/plugin.php b/inc/plugin.php
index 763b57bf2..33cb06c87 100644
--- a/inc/plugin.php
+++ b/inc/plugin.php
@@ -215,6 +215,15 @@ class DokuWiki_Plugin {
     return p_render($format, p_get_instructions($text),$info);
   }
 
+  /**
+   * Allow the plugin to prevent DokuWiki creating a second instance of itself
+   *
+   * @return bool   true if the plugin can not be instantiated more than once
+   */
+  function isSingleton() {
+    return false;
+  }
+
   // deprecated functions
   function plugin_localFN($id) { return $this->localFN($id); }
   function plugin_locale_xhtml($id) { return $this->locale_xhtml($id); }
diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php
index 670dcff5d..924a475e0 100644
--- a/inc/plugincontroller.class.php
+++ b/inc/plugincontroller.class.php
@@ -66,7 +66,7 @@ class Doku_Plugin_Controller {
 
     //plugin already loaded?
     if(!empty($DOKU_PLUGINS[$type][$name])){
-      if ($new) {
+      if ($new  && !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
         $class = $type.'_plugin_'.$name;
         return class_exists($class) ? new $class : null;
       } else {
diff --git a/lib/plugins/syntax.php b/lib/plugins/syntax.php
index 7ded173cd..126e01952 100644
--- a/lib/plugins/syntax.php
+++ b/lib/plugins/syntax.php
@@ -266,5 +266,13 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
     return $conf;
   }
 
+  /**
+   * Allow the plugin to prevent DokuWiki creating a second instance of itself
+   *
+   * @return bool   true if the plugin can not be instantiated more than once
+   */
+  function isSingleton() {
+    return false;
+  }
 }
 //Setup VIM: ex: et ts=4 enc=utf-8 :
-- 
GitLab