Hal\Pattern\Resolver\Structural\Proxy\ProxyResolver::resolve PHP Method

resolve() public method

A class implements an interface or extends an (abstract) class, and owns a reference to a class that implements the same interface or extends the same (abstract) class.
public resolve ( Hal\Pattern\Resolver\ResolvedClass $resolved )
$resolved Hal\Pattern\Resolver\ResolvedClass
    public function resolve(ResolvedClass $resolved)
    {
        $class = $resolved->getClass();
        $pattern = new Proxy($class->getFullname());
        if ($class->getParent() || $class->getInterfaces()) {
            $deps = $class->getDependencies();
            foreach ($deps as $dep) {
                // does call any class ?
                $dep = $this->searchClassNamed($dep, $this->classes);
                if (!$dep || $dep->getFullname() === $class->getFullname()) {
                    continue;
                }
                // same parent ?
                $sameKind = null !== $dep->getParent() && $dep->getParent() === $class->getParent();
                // same interface ?
                $sameKind = $sameKind || sizeof(array_intersect($class->getInterfaces(), $dep->getInterfaces())) > 0;
                if ($sameKind) {
                    $pattern->setProxified($dep->getFullname());
                    $resolved->pushPattern($pattern);
                    return;
                }
            }
        }
    }

Usage Example

 public function testProxyIsDetected()
 {
     $filename = __DIR__ . '/../../../../resources/patterns/proxy.php';
     $extractor = new Extractor(new Tokenizer());
     $result = $extractor->extract($filename);
     $classes = $result->getClasses();
     $class = $classes[2];
     $resolved = new ResolvedClass($class);
     $resolver = new ProxyResolver($classes);
     $resolver->resolve($resolved);
     $this->assertEquals(1, sizeof($resolved->getPatterns()));
 }
ProxyResolver