/**
* Performs weaving of functions in the current namespace
*
* @param array|Advisor[] $advisors List of advisors
* @param StreamMetaData $metadata Source stream information
* @param ReflectionFileNamespace $namespace Current namespace for file
*
* @return boolean True if functions were processed, false otherwise
*/
private function processFunctions(array $advisors, StreamMetaData $metadata, $namespace)
{
static $cacheDirSuffix = '/_functions/';
$wasProcessedFunctions = false;
$functionAdvices = $this->adviceMatcher->getAdvicesForFunctions($namespace, $advisors);
$cacheDir = $this->cachePathManager->getCacheDir();
if (!empty($functionAdvices) && $cacheDir) {
$cacheDir = $cacheDir . $cacheDirSuffix;
$fileName = str_replace('\\', '/', $namespace->getName()) . '.php';
$functionFileName = $cacheDir . $fileName;
if (!file_exists($functionFileName) || !$this->container->isFresh(filemtime($functionFileName))) {
$dirname = dirname($functionFileName);
if (!file_exists($dirname)) {
mkdir($dirname, $this->options['cacheFileMode'], true);
}
$source = new FunctionProxy($namespace, $functionAdvices);
file_put_contents($functionFileName, $source, LOCK_EX);
// For cache files we don't want executable bits by default
chmod($functionFileName, $this->options['cacheFileMode'] & ~0111);
}
$content = 'include_once AOP_CACHE_DIR . ' . var_export($cacheDirSuffix . $fileName, true) . ';' . PHP_EOL;
$metadata->source .= $content;
$wasProcessedFunctions = true;
}
return $wasProcessedFunctions;
}