/** * Возвращает код advice секции для auto pointcut * * @param string $class * @param string $method * @param string $autoPointcut * @return Miaox_Aop_Advice */ public function &getAdviceFromAutoPointcut($class, $method, $autoPointcut) { $advice = new Miaox_Aop_Advice(); $a =& $this->_weave->getAdviceFromAutoPointcut($class, $method, $autoPointcut); $code = $a->getData(); // Does it has any code to replace? if (strlen($code) > 0) { // PHP Code Cruncher if ($this->_compact) { $code = Miaox_Aop_CodeCruncher::process($code); } else { $code = "\r\n" . $code . "\r\n"; } // Add an informative text $code = "/* AOP \"" . $autoPointcut . "\" Auto Code */ " . $code . " "; } $advice->addData($code); return $advice; }
/** * Возвращает все advice для авто среза, удовлетволяющего условиям * * @param string $className имя класса -- фильтр для среза * @param string $functionName имя функции -- фильтр для среза * @param string $autoPointcut значение из набора ( before|after|around ) -- фильтр * @return Miaox_Aop_Advice */ public function &getAdviceFromAutoPointcut($className, $functionName, $autoPointcut) { $advice = new Miaox_Aop_Advice(); $pointcuts =& $this->getPointcuts(); $l = count($pointcuts); for ($i = 0; $i < $l; $i++) { $pointcut =& $pointcuts[$i]; if ($pointcut instanceof Miaox_Aop_Pointcut_Auto && ($pointcut->hasClassName($className) || $pointcut->hasClassName("")) && ($pointcut->hasFunctionName($functionName) || $pointcut->hasFunctionName(""))) { if (!($pointcut->hasNotInClassName($className) || $pointcut->hasNotInFunctionName($functionName))) { if ($pointcut->hasAuto($autoPointcut)) { $a = $pointcut->getAdvice(); $advice->addData($a->getData()); } if ($pointcut->hasAuto("around")) { $a = $pointcut->getAdvice(); //eregi( "(.*)[\t\s \n ]proceed\(\);(.*)", $a->getData(), $data ); $data = explode('proceed();', $a->getData()); array_unshift($data, $a->getData()); if ($autoPointcut == "before") { $data = isset($data[1]) ? $data[1] : $a->getData(); } else { if ($autoPointcut == "after") { $data = isset($data[2]) ? $data[2] : $a->getData(); } } $advice->addData($data); } } else { $this->_checkForAttrMatching($pointcut, $className, $functionName); } } } return $advice; }
/** * Возвращает advice, содержащий все методы advice из срезов, загруженных в weave и удовлетворающих условиям * * @param string $className имя класса * @param string имя метода/функции * @param string $autoPointcut "after"|"before"|"around" * @return Miaox_Aop_Advice результирующий advice */ public function &getAdviceFromAutoPointcut($className, $functionName, $autoPointcut) { $advice = new Miaox_Aop_Advice(); $aspects = $this->getAspects(); $l = count($aspects); for ($i = 0; $i < $l; $i++) { $aspect =& $this->_aspects[$i]; $a =& $aspect->getAdviceFromAutoPointcut($className, $functionName, $autoPointcut); $advice->addData($a->getData()); } return $advice; }