/**
  * {@inheritdoc}
  */
 public function buildDiscovery()
 {
     $this->assertPackagesLoaded();
     $this->emitWarningForDuplicateTypes();
     $this->emitWarningForInvalidBindings();
     if (count($this->discovery->getBindings()) > 0 || count($this->discovery->getDefinedTypes()) > 0) {
         throw new DiscoveryNotEmptyException('The discovery is not empty.');
     }
     $tx = new Transaction();
     try {
         foreach ($this->typeDescriptors->toArray() as $typeName => $typesByPackage) {
             foreach ($typesByPackage as $typeDescriptor) {
                 if ($typeDescriptor->isEnabled()) {
                     $tx->execute($this->defineType($typeDescriptor));
                 }
             }
         }
         foreach ($this->bindingDescriptors->toArray() as $bindingDescriptor) {
             if ($bindingDescriptor->isEnabled()) {
                 $tx->execute($this->bind($bindingDescriptor));
             }
         }
         $tx->commit();
     } catch (Exception $e) {
         $tx->rollback();
         throw $e;
     }
 }