예제 #1
0
파일: Weaver.php 프로젝트: reoring/sabel
 private function _build($adviceClass)
 {
     $this->advice = $advice = new $adviceClass();
     if (isset(self::$reflectionCache[$adviceClass])) {
         $reflection = self::$reflectionCache[$adviceClass];
     } else {
         $reflection = new Sabel_Reflection_Class($advice);
         self::$reflectionCache[$adviceClass] = $reflection;
     }
     $annotatedAdvisor = $reflection->getAnnotation("advisor");
     if ($annotatedAdvisor !== null) {
         $this->advisorClass = $annotatedAdvisor[0][0];
     }
     $annotatedInterceptor = $reflection->getAnnotation("interceptor");
     if ($annotatedInterceptor !== null) {
         $this->interceptorClass = $annotatedInterceptor[0][0];
     }
     $annotatedClass = $reflection->getAnnotation("classMatch");
     if ($annotatedClass !== null) {
         $this->annotatedClass = $annotatedClass[0][0];
     }
     foreach ($reflection->getMethods() as $method) {
         $this->addToAdvisor($method, $advice);
     }
 }
예제 #2
0
 public function build($weaverClass, $targetClass, $adviceClasses)
 {
     $this->weaver = new $weaverClass($targetClass);
     if (!is_array($adviceClasses)) {
         $adviceClasses = array($adviceClasses);
     }
     $adviceClasses = array_reverse($adviceClasses);
     foreach ($adviceClasses as $adviceClass) {
         $advice = new $adviceClass();
         $this->advice = $advice;
         $reflection = new Sabel_Reflection_Class($advice);
         $annotatedAdvisor = $reflection->getAnnotation("advisor");
         if ($annotatedAdvisor !== null) {
             $this->advisorClass = $annotatedAdvisor[0][0];
         }
         $annotatedInterceptor = $reflection->getAnnotation("interceptor");
         if ($annotatedInterceptor !== null) {
             $this->interceptorClass = $annotatedInterceptor[0][0];
         }
         $annotatedClass = $reflection->getAnnotation("classMatch");
         if ($annotatedClass !== null) {
             $this->annotatedClass = $annotatedClass[0][0];
         }
         foreach ($reflection->getMethods() as $method) {
             $this->addToAdvisor($method);
         }
     }
     return $this->weaver;
 }
예제 #3
0
 public function getProxy()
 {
     if ($this->target === null) {
         throw new Sabel_Exception_Runtime("must be set target class");
     }
     if (!is_object($this->target)) {
         if (class_exists($this->target)) {
             $this->target = new $this->target();
         }
     }
     $adviced = new Sabel_Aspect_Adviced();
     $reflection = new Sabel_Reflection_Class($this->target);
     foreach ($this->advisor as $advisor) {
         if (!$advisor instanceof Sabel_Aspect_Advisor) {
             throw new Sabel_Exception_Runtime("advisor must be implements Sabel_Aspect_Advisor");
         }
         $pointcut = $advisor->getPointcut();
         if (!$pointcut instanceof Sabel_Aspect_Pointcut) {
             throw new Sabel_Exception_Runtime("pointcut must be Sabel_Aspect_Pointcut");
         }
         $pointcuts = new Sabel_Aspect_DefaultPointcuts();
         foreach ($reflection->getMethods() as $method) {
             if ($pointcuts->matches($pointcut, $method->getName(), $this->target)) {
                 $adviced->addAdvices($method->getName(), $advisor->getAdvice());
             }
         }
     }
     if ($adviced->hasAdvices()) {
         $proxy = new Sabel_Aspect_Proxy_Static($this->target);
         $proxy->__setAdviced($adviced);
         return $proxy;
     } else {
         // no match found. return a raw target object.
         return $this->target;
     }
 }