/**
  * Lookup the document class to find methods that match to event lifecycle names
  *
  * @param ClassMetadata $metadata  The document metadata.
  * @param string        $className The listener class name.
  *
  * @throws MappingException           When the listener class not found.
  */
 public static function bindDocumentListener(ClassMetadata $metadata, $className)
 {
     $class = $metadata->fullyQualifiedClassName($className);
     if (!class_exists($class)) {
         throw MappingException::documentListenerClassNotFound($class, $className);
     }
     foreach (get_class_methods($class) as $method) {
         if (!isset(self::$events[$method])) {
             continue;
         }
         $metadata->addDocumentListener($method, $class, $method);
     }
 }
 /**
  * @param string            $className
  * @param ClassMetadata     $metadata
  * @param DocumentListeners $annot
  *
  * @throws MappingException
  */
 private function mapDocumentListeners($className, ClassMetadata $metadata, DocumentListeners $annot)
 {
     foreach ($annot->value as $item) {
         $listenerClassName = $metadata->fullyQualifiedClassName($item);
         if (!class_exists($listenerClassName)) {
             throw MappingException::documentListenerClassNotFound($listenerClassName, $className);
         }
         $hasMapping = false;
         $listenerClass = new \ReflectionClass($listenerClassName);
         /* @var $method \ReflectionMethod */
         foreach ($listenerClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
             // find method callbacks.
             $callbacks = $this->getMethodCallbacks($method);
             $hasMapping = $hasMapping ?: !empty($callbacks);
             foreach ($callbacks as $value) {
                 $metadata->addDocumentListener($value[1], $listenerClassName, $value[0]);
             }
         }
         // Evaluate the listener using naming convention.
         if (!$hasMapping) {
             DocumentListenerBuilder::bindDocumentListener($metadata, $listenerClassName);
         }
     }
 }