Hal\Pattern\Resolver\Creational\AbstractFactory\AbstractFactoryResolver::resolve PHP Method

resolve() public method

Resolve AbstractFactory
public resolve ( Hal\Pattern\Resolver\ResolvedClass $resolved )
$resolved Hal\Pattern\Resolver\ResolvedClass
    public function resolve(ResolvedClass $resolved)
    {
        $class = $resolved->getClass();
        $pattern = new AbstractFactory($class->getFullname());
        $resolver = new TypeResolver();
        // we don't look private and non static methods
        $collection = (new Collection($class->getMethods()))->where(sprintf('method => method.getVisibility() == "public" and method.getState() == %s', ReflectedMethod::STATE_STATIC));
        if (empty($collection)) {
            return;
        }
        /** @var ReflectedMethod $method */
        foreach ($collection as $method) {
            // method instanciates at least one object
            $instanciated = array_unique($method->getInstanciedClasses());
            if (empty($instanciated)) {
                continue;
            }
            foreach ($method->getReturns() as $return) {
                // returns an object
                if ($resolver->isNative($return->getType())) {
                    continue;
                }
                // doesn't return itself (avoid singleton)
                if (in_array($return->getType(), array('\\self', '\\static', $class->getFullname()))) {
                    continue;
                }
                $pattern->setCreated($return->getType());
                $resolved->pushPattern($pattern);
                return;
            }
        }
    }

Usage Example

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