/** * @param ReflectionMethod $method * @param Meta $meta * @return string */ private function methodProxy(ReflectionMethod $method, Meta $meta) { $property = $meta->findProperty($method->getName()); if (!$property) { // No need for a proxy if not related to a property return null; } if ($property->isProperty()) { // Properties are loaded straight-up, no need for proxies return null; } $parts = array(); $arguments = array(); foreach ($method->getParameters() as $parameter) { $variable = '$' . $parameter->getName(); $parts[] = $variable; $arg = $variable; if ($parameter->isOptional()) { $arg .= ' = ' . var_export($parameter->getDefaultValue(), true); } if ($parameter->isPassedByReference()) { $arg = "& {$arg}"; } elseif ($c = $parameter->getClass()) { $arg = $c->getName() . ' ' . $arg; } if ($parameter->isArray()) { $arg = "array {$arg}"; } $arguments[] = $arg; } $parts = implode(', ', $parts); $arguments = implode(', ', $arguments); $name = var_export($method->getName(), true); $propertyName = var_export($property->getName(), true); return <<<FUNC function {$method->getName()}({$arguments}) { self::__loadProperty({$name}, {$propertyName}); return parent::{$method->getName()}({$parts}); } FUNC; }