diff --git a/packages/collections/pub/eadlist.php b/packages/collections/pub/eadlist.php index 38f850c..0f6f285 100644 --- a/packages/collections/pub/eadlist.php +++ b/packages/collections/pub/eadlist.php @@ -36,7 +36,7 @@ { ?> &templateset=ead&disabletheme=1&output='>
- __getMixinClosure($MixinClass, 'initialize'); + } } diff --git a/packages/core/lib/archonobject.inc.php b/packages/core/lib/archonobject.inc.php index c1b3742..ec15d4a 100755 --- a/packages/core/lib/archonobject.inc.php +++ b/packages/core/lib/archonobject.inc.php @@ -10,20 +10,14 @@ public function callOverridden() $args = func_get_args(); $MixinClass = prev($methodInfo->Classes); - $arrStrArgs = array(); - - for($i = 0; $i < count($args); $i++) - { - $arrStrArgs[] = "\$args[{$i}]"; - } - // Simulate mixing after. if($_ARCHON->Mixins[get_class($this)]->Methods[$method]->Parameters[$MixinClass]->MixOrder == MIX_AFTER) { $prevresult = call_user_func_array(array($this, 'callOverridden'), $args); } - eval("\$result = {$MixinClass}::{$method}(" . implode(',', $arrStrArgs) . ");"); + $closure = $this->__getMixinClosure($MixinClass, $method); + $result = call_user_func_array($closure->bindTo($this), $args); // Simulate mixing before. if($_ARCHON->Mixins[get_class($this)]->Methods[$method]->Parameters[$MixinClass]->MixOrder == MIX_BEFORE) @@ -235,21 +229,14 @@ public function __call($method, $args) $_ARCHON->Callstack[] = $stackmember; $MixinClass = end(end($_ARCHON->Callstack)->Classes); - $arrStrArgs = array(); - - for($i = 0; $i < count($args); $i++) - { - $arrStrArgs[] = "\$args[{$i}]"; - } - // Simulate mixing after. if($_ARCHON->Mixins[get_class($this)]->Methods[$method]->Parameters[$MixinClass]->MixOrder == MIX_AFTER) { $prevresult = call_user_func_array(array($this, 'callOverridden'), $args); } - eval("\$result = {$MixinClass}::{$method}(" . implode(',', $arrStrArgs) . ");"); - //$result = call_user_func_array(array(($MixinClass) $this, $method), $args); + $closure = $this->__getMixinClosure($MixinClass, $method); + $result = call_user_func_array($closure->bindTo($this), $args); // Simulate mixing before. if($_ARCHON->Mixins[get_class($this)]->Methods[$method]->Parameters[$MixinClass]->MixOrder == MIX_BEFORE) @@ -308,5 +295,21 @@ public function __toString() return get_class($this); } } + + + private function __getMixinClosure($MixinClass, $mixinMethod) { + $method = new ReflectionMethod($MixinClass, $mixinMethod); + $start = $method->getStartLine() - 1; + $length = $method->getEndLine() - $start; + + $source = file($method->getFileName()); + $method_body = implode("", array_slice($source, $start, $length)); + $method_body = preg_replace("/$mixinMethod/", "", $method_body, 1); + $method_body = preg_replace("/public/", "", $method_body, 1); + eval('$closure = '.$method_body.';'); + + return $closure; + } + } ?> diff --git a/packages/core/lib/querylog.inc.php b/packages/core/lib/querylog.inc.php index 66c8a43..6930086 100755 --- a/packages/core/lib/querylog.inc.php +++ b/packages/core/lib/querylog.inc.php @@ -5,7 +5,7 @@ public function logQuery(&$DB, $Scope, $Message, $IsManip = NULL) { $this->QueryCount++; - if($OutputQueries) + if($this->OutputQueries) { echo("\n\n$Message\n\n"); }