/**
   * Search for magic variables using the @property tag
   *
   * @param types
   * @param variableName
   * @param cache
   */
  private void resolveMagicClassVariableDeclaration(
      IType[] types, String variableName, IModelAccessCache cache) {
    for (IType type : types) {
      resolveMagicClassVariableDeclaration(variableName, type, cache);
      try {
        if (evaluated.isEmpty()
            && type.getSuperClasses() != null
            && type.getSuperClasses().length > 0) {

          ITypeHierarchy hierarchy = null;
          if (cache != null) {
            hierarchy = cache.getSuperTypeHierarchy(type, null);
          }
          IType[] superClasses = PHPModelUtils.getSuperClasses(type, hierarchy);

          for (int i = 0; i < superClasses.length /* && evaluated.isEmpty() */; i++) {
            IType superClass = superClasses[i];
            resolveMagicClassVariableDeclaration(variableName, superClass, cache);
          }
        }
      } catch (ModelException e) {
        e.printStackTrace();
      }
    }
  }
  private void collectSuperClasses(IScriptProject project, String typeName, Set superClassSet) {

    Set typeSet = new HashSet();
    searchTypeDeclarations(project, typeName, typeSet);

    if (typeSet.isEmpty() != true) {
      IType itype;
      String[] superClasses;
      for (Iterator typeIter = typeSet.iterator(); typeIter.hasNext(); ) {
        itype = (IType) typeIter.next();
        if (itype.exists()) {
          try {
            superClasses = itype.getSuperClasses();
            if (superClasses != null) {
              for (int cnt = 0, max = superClasses.length; cnt < max; cnt++) {
                if (!superClassSet.contains(superClasses[cnt])) {
                  superClassSet.add(superClasses[cnt]);

                  collectSuperClasses(project, superClasses[cnt], superClassSet);
                }
              }
            }
          } catch (ModelException mxcn) {
            mxcn.printStackTrace();
          }
        }
      }
    }
  }