/**
  * Get a global version number, which changes whenever any atom or atomizer
  * implementation changes in a way which is not backward-compatible.
  */
 private function getDivinerAtomWorldVersion()
 {
     $version = array();
     $version['atom'] = DivinerAtom::getAtomSerializationVersion();
     $version['rules'] = $this->getRules();
     $atomizers = id(new PhutilSymbolLoader())->setAncestorClass('DivinerAtomizer')->setConcreteOnly(true)->selectAndLoadSymbols();
     $atomizer_versions = array();
     foreach ($atomizers as $atomizer) {
         $atomizer_versions[$atomizer['name']] = call_user_func(array($atomizer['name'], 'getAtomizerVersion'));
     }
     ksort($atomizer_versions);
     $version['atomizers'] = $atomizer_versions;
     return md5(serialize($version));
 }
 /**
  * Get a global version number, which changes whenever any atom or atomizer
  * implementation changes in a way which is not backward-compatible.
  */
 private function getDivinerAtomWorldVersion()
 {
     $version = array();
     $version['atom'] = DivinerAtom::getAtomSerializationVersion();
     $version['rules'] = $this->getRules();
     $atomizers = id(new PhutilClassMapQuery())->setAncestorClass('DivinerAtomizer')->execute();
     $atomizer_versions = array();
     foreach ($atomizers as $atomizer) {
         $name = get_class($atomizer);
         $atomizer_versions[$name] = call_user_func(array($name, 'getAtomizerVersion'));
     }
     ksort($atomizer_versions);
     $version['atomizers'] = $atomizer_versions;
     return md5(serialize($version));
 }