class ClassVisitor {

  public synchronized Set<ConstructId> visitConstructors(boolean _instrument)
      throws CannotCompileException {
    final Set<ConstructId> constructs = new HashSet<ConstructId>();
    final CtConstructor[] constructors = this.c.getDeclaredConstructors();
    String constr_name = null;
    JavaId jid = null;

    // Skip the first constructor parameter (added by the compiler for non-static classes)?
    final String param_to_skip =
        (this.declaringClass != null && !Modifier.isStatic(this.c.getModifiers())
            ? ClassVisitor.removePackageContext(this.declaringClass.getName())
            : null);

    // Static initializer <clinit> exists: Add it to the constructs and instrument (if requested)
    final CtConstructor initializer = this.c.getClassInitializer();
    if (initializer != null && this.javaId.getType() == Type.CLASS) {
      jid = ((JavaClassId) this.javaId).getClassInit();
      constructs.add(jid);

      // Instrument if requested
      if (_instrument
          && !isInstrumented()
          && !initializer.isEmpty()
          && initializer.getLongName().startsWith(this.qname)) {
        try {
          constr_name = this.removeParameterQualification(initializer.getLongName());
          this.instrument(jid, initializer);
        }
        // Can happen if dependencies of the class are not available in the ClassPool
        catch (CannotCompileException ex) {
          // ClassVisitor.getLog().error("Exception while instrumenting initializer [" + constr_name
          // + "]: " + ex.getMessage());
          throw ex;
        }
      }
    }

    // Loop all constructors and instrument (if requested)
    for (CtConstructor constr : constructors) {
      jid =
          JavaId.parseConstructorQName(
              this.javaId.getType(),
              ClassVisitor.removeParameterQualification(constr.getLongName()),
              param_to_skip);
      constructs.add(jid);

      // Instrument if requested
      if (_instrument
          && !isInstrumented()
          && !constr.isEmpty()
          && constr.getLongName().startsWith(this.qname)) {
        try {
          constr_name = this.removeParameterQualification(constr.getLongName());
          this.instrument(jid, constr);
        }
        // Can happen if dependencies of the class are not available in the ClassPool
        catch (CannotCompileException ex) {
          // ClassVisitor.getLog().error("Exception while instrumenting constructor [" + constr_name
          // + "]: " + ex.getMessage());
          throw ex;
        }
      }
    }
    ClassVisitor.getLog()
        .debug("Class '" + this.qname + "': " + constructors.length + " constructors");
    return constructs;
  }

  public  ClassVisitor(CtClass _c);

}