protected function reflectEmergedClasses()
{
$classNamesToReflect = [];
foreach ($this->availableClassNames as $classNamesInOnePackage) {
$classNamesToReflect = array_merge($classNamesToReflect, $classNamesInOnePackage);
}
$reflectedClassNames = array_keys($this->classReflectionData);
sort($classNamesToReflect);
sort($reflectedClassNames);
$newClassNames = array_diff($classNamesToReflect, $reflectedClassNames);
if ($newClassNames === []) {
return;
}
$this->systemLogger->log('Reflected class names did not match class names to reflect', LOG_DEBUG);
$count = 0;
$classNameFilterFunction = function ($className) use(&$count) {
$this->reflectClass($className);
if (!$this->isClassAnnotatedWith($className, Flow\Entity::class) && !$this->isClassAnnotatedWith($className, ORM\Entity::class) && !$this->isClassAnnotatedWith($className, ORM\Embeddable::class) && !$this->isClassAnnotatedWith($className, Flow\ValueObject::class)) {
return false;
}
$scopeAnnotation = $this->getClassAnnotation($className, Flow\Scope::class);
if ($scopeAnnotation !== null && $scopeAnnotation->value !== 'prototype') {
throw new Exception(sprintf('Classes tagged as entity or value object must be of scope prototype, however, %s is declared as %s.', $className, $scopeAnnotation->value), 1264103349);
}
$count++;
return true;
};
$classNamesToBuildSchemaFor = array_filter($newClassNames, $classNameFilterFunction);
$this->buildClassSchemata($classNamesToBuildSchemaFor);
if ($count > 0) {
$this->log(sprintf('Reflected %s emerged classes.', $count), LOG_INFO);
}
}