/**
   * End
   *
   * @param descr
   */
  private void visitBindingDescr(BindingDescr descr) {

    Variable variable = new Variable(rule);
    variable.setName(descr.getVariable());
    variable.setOrderNumber(orderNumber.next());
    variable.setParentPath(rule.getPath());
    variable.setParentType(rule.getVerifierComponentType());

    variable.setObjectTypeType(VerifierComponentType.FIELD.getType());

    data.add(variable);
  }
  private Pattern visitPatternDescr(PatternDescr descr, VerifierComponent parent, int orderNumber)
      throws UnknownDescriptionException {

    objectType = data.getObjectTypeByFullName(descr.getObjectType());

    if (objectType == null) {
      Import objectImport = data.getImportByName(descr.getObjectType());

      if (objectImport != null) {
        objectType = ObjectTypeFactory.createObjectType(objectImport);
      } else {
        objectType = ObjectTypeFactory.createObjectType(descr.getObjectType());
      }

      data.add(objectType);
    }

    pattern = new Pattern(rule);
    if (parent != null) {
      pattern.setParentPath(parent.getPath());
      pattern.setParentType(parent.getVerifierComponentType());
    }
    pattern.setObjectTypePath(objectType.getPath());
    pattern.setName(objectType.getName());
    pattern.setPatternNot(solvers.getRuleSolver().isChildNot());
    pattern.setPatternExists(solvers.getRuleSolver().isExists());
    pattern.setPatternForall(solvers.getRuleSolver().isForall());
    pattern.setOrderNumber(orderNumber);

    if (descr.getIdentifier() != null) {
      Variable variable = new Variable(rule);
      variable.setName(descr.getIdentifier());

      variable.setObjectTypeType(VerifierComponentType.OBJECT_TYPE.getType());
      variable.setObjectTypePath(objectType.getPath());
      variable.setObjectTypeType(descr.getObjectType());

      data.add(variable);
    }

    // visit source.
    if (descr.getSource() != null) {
      visit(descr.getSource());
    } else {
      if (workingMemory == null) {
        workingMemory = new WorkingMemory();
        data.add(workingMemory);
      }
      pattern.setSourcePath(workingMemory.getPath());
      pattern.setSourceType(workingMemory.getVerifierComponentType());
    }

    solvers.startPatternSolver(pattern);

    visit(descr.getConstraint());

    solvers.endPatternSolver();

    data.add(pattern);

    return pattern;
  }