From OrganicDesign
| This code exhibits voodoo programming techniques. The most common of these is extending an instance's class at runtime after it has been instantiated, a technique that can be used to provide additional hooks into existing code without requiring modification of code-base files. For a list of all our scripts which exhibit voodoo, see Category:Code that uses voodoo.
|
|
<?php
# Extension:IsAllowedHook
# - Started: 2007-10-09
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('ISALLOWED_VERSION','0.0.0, 2007-10-09');
$wgExtensionCredits['parserhook'][] = array(
'name' => "IsAllowedHook",
'author' => '[http://www.organicdesign.co.nz/nad User:Nad]',
'description' => 'Adds a new hook called "IsAllowed" which is called from the User::isAllowed method.',
'url' => 'http://www.organicdesign.co.nz/Extension:IsAllowedHook.php',
'version' => ISALLOWED_VERSION
);
# This is the earliest hook I can find after which $wgUser is an instance of the User class
$wgHooks['userCan'][] = 'wfSetupIsAllowed';
function wfSetupIsAllowed() {
# Return unless first call
static $first = 0;
if ($first++) return true;
global $wgUser;
# Create a new User class ($User2) by extending the existing one with an overridden isAllowed method
$User = get_class($wgUser);
$User2 = $User.'2';
eval("class $User2 extends $User".' {
function isAllowed($action = "") {
$result = NULL;
wfRunHooks("IsAllowed",array(&$this,$action,&$result));
return $result === NULL ? $result = parent::isAllowed($action) : $result;
}
}');
# Replace the $wgUser object with an identical $User2 instance
$oldUser = $wgUser;
$wgUser = new $User2();
foreach(array_keys(get_class_vars($User)) as $k) $wgUser->$k = $oldUser->$k;
return true;
}
?>