public DynamicType.Builder<?> define(String transformClassName, DynamicType.Builder<?> builder)
      throws PluginException {
    String interceptorDefineClassName = this.getClass().getName();

    if (StringUtil.isEmpty(transformClassName)) {
      logger.warn(
          "classname of being intercepted is not defined by {}.", interceptorDefineClassName);
      return builder;
    }

    logger.debug(
        "prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName);

    /** find witness classes for enhance class */
    String[] witnessClasses = witnessClasses();
    if (witnessClasses != null) {
      for (String witnessClass : witnessClasses) {
        Resolution witnessClassResolution = PluginBootstrap.CLASS_TYPE_POOL.describe(witnessClass);
        if (!witnessClassResolution.isResolved()) {
          logger.warn(
              "enhance class {} by plugin {} is not working. Because witness class {} is not existed.",
              transformClassName,
              interceptorDefineClassName,
              witnessClass);
          return builder;
        }
      }
    }

    /** find origin class source code for interceptor */
    DynamicType.Builder<?> newClassBuilder = this.enhance(transformClassName, builder);

    logger.debug(
        "enhance class {} by {} completely.", transformClassName, interceptorDefineClassName);

    return newClassBuilder;
  }