Allow manual plugin loading

This commit is contained in:
Daniel Rudolf 2016-02-29 19:50:35 +01:00
parent 4f487b7ccf
commit 56b2ed6c7d

View file

@ -383,6 +383,7 @@ class Pico
* - 60 to 79: Plugins hooking into template or markdown parsing
* - 80 to 99: Plugins using the `onPageRendered` event
*
* @see Pico::loadPlugin()
* @see Pico::getPlugin()
* @see Pico::getPlugins()
* @return void
@ -404,11 +405,52 @@ class Pico
$this->plugins[$className] = $plugin;
} else {
// TODO: breaks backward compatibility
//throw new RuntimeException("Unable to load plugin '".$className."'");
//throw new RuntimeException("Unable to load plugin '" . $className . "'");
}
}
}
/**
* Manually loads a plugin
*
* Manually loaded plugins must implement {@see PicoPluginInterface}.
*
* @see Pico::loadPlugins()
* @see Pico::getPlugin()
* @see Pico::getPlugins()
* @param PicoPluginInterface|string $plugin either the class name of a
* plugin to instantiate or a plugin instance
* @return PicoPluginInterface instance of the loaded plugin
* @throws RuntimeException thrown when a plugin couldn't
* be loaded
*/
public function loadPlugin($plugin)
{
if (!is_object($plugin)) {
$className = (string) $plugin;
if (class_exists($className)) {
$plugin = new $className($this);
} else {
throw new RuntimeException("Unable to load plugin '" . $className . "'");
}
}
$className = get_class($plugin);
if (!is_a($plugin, 'PicoPluginInterface')) {
throw new RuntimeException(
"Manually loaded plugins must implement 'PicoPluginInterface', "
. "'" . $className . "' given"
);
}
if ($this->plugins === null) {
$this->plugins = array();
}
$this->plugins[$className] = $plugin;
return $plugin;
}
/**
* Returns the instance of a named plugin
*