From a46d0d658b98649869f6c9660e168af3940d7c30 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Sat, 30 Jul 2005 23:51:56 +0200
Subject: [PATCH] Changed pluginloading to use references

This patch allows the use of $this in syntax plugins to set internal variables
and let them remain between handle and render calls. Even when it is possible
now to use this method you should exchange data betwenn handler and render calls
by using the $data array only.

darcs-hash:20050730215156-7ad00-69ea79859360d9902533633395de3e1b677f6e46.gz
---
 inc/parser/handler.php |  4 ++--
 inc/parser/xhtml.php   |  4 ++--
 inc/parserutils.php    |  3 ++-
 inc/pluginutils.php    | 13 +++++--------
 4 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index ded291356..55cbcf342 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -66,8 +66,8 @@ class Doku_Handler {
      */
     function plugin($match, $state, $pos, $pluginname){
         $data = array($match);
-        $plugin = null;
-        if(plugin_load('syntax',$pluginname,$plugin)){
+        $plugin =& plugin_load('syntax',$pluginname); 
+        if($plugin != null){
             $data = $plugin->handle($match, $state, $pos, $this);
         }
         $this->_addCall('plugin',array($pluginname,$data,$pos),$pos);
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 2fd5844d0..7dd1b8034 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -86,8 +86,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
 
     //handles plugin rendering
     function plugin($name,$data){
-        $plugin = null;
-        if(plugin_load('syntax',$name,$plugin)){
+        $plugin =& plugin_load('syntax',$name); 
+        if($plugin != null){
             $plugin->render('xhtml',$this,$data);
         }
     }
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 1bf36c5fd..e3bd04524 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -199,7 +199,7 @@ function p_get_parsermodes(){
     global $PARSER_MODES;
     $obj = null; 
     foreach($pluginlist as $p){
-      plugin_load('syntax',$p,$obj);                  //load plugin into $obj
+      $obj =& plugin_load('syntax',$p);               //load plugin into $obj
       $PARSER_MODES[$obj->getType()][] = "plugin_$p"; //register mode type
       //add to modes
       $modes[] = array(
@@ -207,6 +207,7 @@ function p_get_parsermodes(){
                    'mode' => "plugin_$p",
                    'obj'  => $obj,
                  );
+      unset($obj); //remove the reference
     }
   }
 
diff --git a/inc/pluginutils.php b/inc/pluginutils.php
index 49dd44816..6c758a1be 100644
--- a/inc/pluginutils.php
+++ b/inc/pluginutils.php
@@ -34,29 +34,26 @@ function plugin_list($type){
  *
  * @param  $type string 	type of plugin to load
  * @param  $name string 	name of the plugin to load
- * @param  $ref  ref      will contain the plugin object
- * @return boolean        plugin loading successful?
+ * @return object         the plugin object or null on failure
  */
-function plugin_load($type,$name,&$ref){
+function &plugin_load($type,$name){
   //we keep all loaded plugins available in global scope for reuse
   global $DOKU_PLUGINS;
 
 	//plugin already loaded?
 	if($DOKU_PLUGINS[$type][$name] != null){
-		$ref = $DOKU_PLUGINS[$type][$name];
-		return true;
+		return $DOKU_PLUGINS[$type][$name];
 	}
 
   //try to load the wanted plugin file
   if(!include_once(DOKU_PLUGIN.$name.'/'.$type.'.php')){
-    return false;
+    return null;
   }
 
   //construct class and instanciate
   $class = $type.'_plugin_'.$name;
   $DOKU_PLUGINS[$type][$name] = new $class;
-  $ref = $DOKU_PLUGINS[$type][$name];
-  return true;
+  return $DOKU_PLUGINS[$type][$name];
 }
 
 
-- 
GitLab