public static void createEventInterface(
      Option option, String packageName, String rootDirectoryPathName) {
    JCodeModel model = new JCodeModel();

    try {
      JDefinedClass jClass =
          model._class(
              packageName + "." + EventHelper.getEventNamePrefix(option) + EventHelper.EVENT_SUFFIX,
              ClassType.INTERFACE);
      // jClass._extends(NativeEvent.class);

      // TODO this logic should not be in an helper, pb it is duplicated
      // inside all helper, should have a common algo
      // write getter for Series / Point / Chart / Axis (context) inside
      // event
      if (option.getContext() != null)
        EventHelper.getType(option)
            .accept(new EventGetterWriterVisitor(option, jClass, model), OutputType.Interface);

      ClassRegistry.INSTANCE.put(option, OutputType.Interface, jClass);

    } catch (JClassAlreadyExistsException e) {
      throw new RuntimeException(e);
    }

    try {
      model.build(new File(rootDirectoryPathName));
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
  public static JDefinedClass createFunctionCallbackInterface(
      Option option, String packageName, String rootDirectoryPathName) {
    JCodeModel model = new JCodeModel();

    JDefinedClass jClass = null;

    try {
      String fqn = FunctionHelper.getFunctionCallbackFqn(option, packageName);

      JClass contextObject = FunctionHelper.getContextObject(option, OutputType.Interface);

      jClass = model._class(fqn, ClassType.INTERFACE);

      JMethod method = jClass.method(JMod.NONE, Object.class, EventHelper.ON_PREFIX + "Callback");

      if (contextObject != null)
        method.param(
            contextObject,
            option.getContext().substring(0, 1).toLowerCase() + option.getContext().substring(1));

      ClassRegistry.INSTANCE
          .getRegistry()
          .put(new ClassRegistry.RegistryKey(option, OutputType.Interface), jClass);

      logger.info("Function callback created;" + option.getTitle());

    } catch (JClassAlreadyExistsException e) {
      throw new RuntimeException(e);
    }

    try {
      model.build(new File(rootDirectoryPathName));
    } catch (IOException e) {
      throw new RuntimeException(e);
    }

    return jClass;
  }
  public static void addEventHandlerRegistrationMethods(Option option, JDefinedClass jClass) {

    List<JClass> list = EventRegistry.INSTANCE.getRegistry().get(option.getFullname());
    if (list != null) {
      for (JClass handlerClass : list) {
        String handlerClassName = handlerClass.name();
        String paramName =
            handlerClassName.substring(0, 1).toLowerCase() + handlerClassName.substring(1);
        jClass
            .method(JMod.NONE, void.class, EventHelper.ADD_HANDLER_METHOD_PREFIX + handlerClassName)
            .param(handlerClass, paramName);
      }
    }
  }
 public FieldStringWriter(JDefinedClass jClass, Option option, boolean pipe, String fieldName) {
   super(jClass, pipe, fieldName, option.getDescription());
   this.defaultValue = option.getDefaults();
 }