/**
  * Gets the commit order for all the classes available via the provided {@see ClassMetadataFactory}
  *
  * @param ClassMetadataFactory $mdf
  *
  * @return \string[]
  */
 public static function getCommitOrderFromMetadata(ClassMetadataFactory $mdf)
 {
     $cd = $mdf->getCacheDriver();
     if ($cd->contains(self::CACHE_KEY)) {
         return $cd->fetch(self::CACHE_KEY);
     }
     $co = new self();
     /** @var ClassMetadata $class */
     foreach ($mdf->getAllMetadata() as $class) {
         $co->classes[$class->name] = $class;
         foreach ($class->associationMappings as $assoc) {
             if (!isset($assoc['reference']) || !isset($assoc['targetDoc'])) {
                 continue;
             }
             /** @var ClassMetadata $dependency */
             $dependency = $mdf->getMetadataFor($assoc['targetDoc']);
             if (!$co->hasDependency($dependency, $class)) {
                 $co->addDependency($dependency, $class);
             }
             // If the target class has mapped subclasses, these share the same dependency.
             //                if ( ! $targetClass->subClasses) {
             //                    continue;
             //                }
             //
             //                foreach ($targetClass->subClasses as $subClassName) {
             //                    $targetSubClass = $this->dm->getClassMetadata($subClassName);
             //
             //                    if ( ! $calc->hasClass($subClassName)) {
             //                        $calc->addClass($targetSubClass);
             //
             //                        $newNodes[] = $targetSubClass;
             //                    }
             //
             //                    $calc->addDependency($targetSubClass, $class);
             //                }
         }
     }
     $ordered = $co->getCommitOrder();
     $cd->save(self::CACHE_KEY, $ordered);
     return $ordered;
 }
 /**
  * {@inheritdoc}
  */
 public static function fromArray(array $values)
 {
     $message = new self();
     $values = array_merge(['name' => null, 'package' => null, 'dependency' => [], 'public_dependency' => [], 'weak_dependency' => [], 'message_type' => [], 'enum_type' => [], 'service' => [], 'extension' => [], 'options' => null, 'source_code_info' => null, 'syntax' => null], $values);
     $message->setName($values['name']);
     $message->setPackage($values['package']);
     $message->setOptions($values['options']);
     $message->setSourceCodeInfo($values['source_code_info']);
     $message->setSyntax($values['syntax']);
     foreach ($values['dependency'] as $item) {
         $message->addDependency($item);
     }
     foreach ($values['public_dependency'] as $item) {
         $message->addPublicDependency($item);
     }
     foreach ($values['weak_dependency'] as $item) {
         $message->addWeakDependency($item);
     }
     foreach ($values['message_type'] as $item) {
         $message->addMessageType($item);
     }
     foreach ($values['enum_type'] as $item) {
         $message->addEnumType($item);
     }
     foreach ($values['service'] as $item) {
         $message->addService($item);
     }
     foreach ($values['extension'] as $item) {
         $message->addExtension($item);
     }
     return $message;
 }