// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/Config.java
// public class Config {
//   @SerializedName("path")
//   protected String path;
// 
//   @SerializedName("file")
//   protected String fileNameEx;
// 
//   public Config(String path, String fileNameEx) {
//     this.path = path;
//     this.fileNameEx = fileNameEx;
//   }
// 
//   public String getPath() {
//     return path;
//   }
// 
//   public String getFullPathname() {
//     return path + "/" + fileNameEx;
//   }
// 
//   public void setPath(String path) {
//     this.path = path;
//   }
// 
//   public String getFileName() {
//     return FileUtils.removeExtension(fileNameEx);
//   }
// 
//   public String getFileNameEx() {
//     return fileNameEx;
//   }
// 
//   public void setFileNameEx(String fileNameEx) {
//     this.fileNameEx = fileNameEx;
//   }
// 
//   @Override
//   public String toString() {
//     return "Config{" +
//         "path='" + path + '\'' +
//         ", fileNameEx='" + fileNameEx + '\'' +
//         '}';
//   }
// }
// 
// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/GradleConfig.java
// public class GradleConfig extends Config {
//   @SerializedName("snippet")
//   private List<Snippet> snippets;
// 
//   public GradleConfig(String path, String fileNameEx) {
//     this(path, fileNameEx, null);
//   }
// 
//   private GradleConfig(String path, String fileNameEx, List<Snippet> snippets) {
//     super(path, fileNameEx);
//     this.snippets = snippets;
//   }
// 
//   public List<Snippet> getSnippets() {
//     return snippets;
//   }
// 
//   public void addSnippet(Snippet snippet) {
//     if (snippets == null) {
//       snippets = new ArrayList<>();
//     }
// 
//     snippets.add(snippet);
//   }
// 
//   @Override
//   public String toString() {
//     return super.toString() + ", GradleConfig{" +
//         "path='" + path + '\'' +
//         ", fileNameEx='" + fileNameEx + '\'' +
//         ", configs=" + snippets +
//         '}';
//   }
// }
// 
// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/JavaConfig.java
// public class JavaConfig extends Config{
//   @SerializedName("import")
//   private List<String> imports;
// 
//   @SerializedName("field")
//   private List<String> fields;
// 
//   @SerializedName("method")
//   private List<Method> methods;
// 
//   public JavaConfig(String path, String fileNameEx) {
//     super(path, fileNameEx);
//   }
// 
//   public List<String> getImports() {
//     return imports;
//   }
// 
//   public List<String> getFields() {
//     return fields;
//   }
// 
//   public List<Method> getMethods() {
//     return methods;
//   }
// 
//   public void replaceImportStrings(String reg, String applicationId) {
//     for (int i = 0, li = imports.size(); i < li; i++) {
//       imports.set(i, imports.get(i).replace(reg, applicationId));
//     }
//   }
// 
//   @Override
//   public String toString() {
//     return super.toString() + ", JavaConfig{" +
//         "imports=" + imports +
//         ", fields=" + fields +
//         ", methods=" + methods +
//         '}';
//   }
// }
// 
// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/ManifestConfig.java
// public class ManifestConfig extends Config {
//   @SerializedName("element")
//   private List<ManifestElement> manifestElements;
// 
//   public ManifestConfig(String path, String fileNameEx) {
//     super(path, fileNameEx);
//   }
// 
//   public List<ManifestElement> getManifestElements() {
//     return manifestElements;
//   }
// 
//   @Override
//   public String toString() {
//     return "ManifestConfig{" +
//         "manifestElements=" + manifestElements +
//         '}';
//   }
// }


import com.androidstarterkit.injection.model.Config;
import com.androidstarterkit.injection.model.GradleConfig;
import com.androidstarterkit.injection.model.JavaConfig;
import com.androidstarterkit.injection.model.ManifestConfig;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
package com.androidstarterkit.injection;




public class ModuleLoader {

  private List<CodeGenerator> codeGenerators;

  public ModuleLoader() {
    codeGenerators = new ArrayList<>();
  }

  public void generateCode() {
    codeGenerators.forEach(CodeGenerator::apply);
  }

  public void addCodeGenerator(CodeGenerator codeGenerator) {
    if (!codeGenerators.contains(codeGenerator)) {
      codeGenerators.add(codeGenerator);
    }
  }

  public void addManifestConfigs(List<ManifestConfig> configs) {
    if (configs != null) {
      configs.forEach(this::addConfig);
    }
  }

// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/Config.java
// public class Config {
//   @SerializedName("path")
//   protected String path;
// 
//   @SerializedName("file")
//   protected String fileNameEx;
// 
//   public Config(String path, String fileNameEx) {
//     this.path = path;
//     this.fileNameEx = fileNameEx;
//   }
// 
//   public String getPath() {
//     return path;
//   }
// 
//   public String getFullPathname() {
//     return path + "/" + fileNameEx;
//   }
// 
//   public void setPath(String path) {
//     this.path = path;
//   }
// 
//   public String getFileName() {
//     return FileUtils.removeExtension(fileNameEx);
//   }
// 
//   public String getFileNameEx() {
//     return fileNameEx;
//   }
// 
//   public void setFileNameEx(String fileNameEx) {
//     this.fileNameEx = fileNameEx;
//   }
// 
//   @Override
//   public String toString() {
//     return "Config{" +
//         "path='" + path + '\'' +
//         ", fileNameEx='" + fileNameEx + '\'' +
//         '}';
//   }
// }
// 
// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/GradleConfig.java
// public class GradleConfig extends Config {
//   @SerializedName("snippet")
//   private List<Snippet> snippets;
// 
//   public GradleConfig(String path, String fileNameEx) {
//     this(path, fileNameEx, null);
//   }
// 
//   private GradleConfig(String path, String fileNameEx, List<Snippet> snippets) {
//     super(path, fileNameEx);
//     this.snippets = snippets;
//   }
// 
//   public List<Snippet> getSnippets() {
//     return snippets;
//   }
// 
//   public void addSnippet(Snippet snippet) {
//     if (snippets == null) {
//       snippets = new ArrayList<>();
//     }
// 
//     snippets.add(snippet);
//   }
// 
//   @Override
//   public String toString() {
//     return super.toString() + ", GradleConfig{" +
//         "path='" + path + '\'' +
//         ", fileNameEx='" + fileNameEx + '\'' +
//         ", configs=" + snippets +
//         '}';
//   }
// }
// 
// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/JavaConfig.java
// public class JavaConfig extends Config{
//   @SerializedName("import")
//   private List<String> imports;
// 
//   @SerializedName("field")
//   private List<String> fields;
// 
//   @SerializedName("method")
//   private List<Method> methods;
// 
//   public JavaConfig(String path, String fileNameEx) {
//     super(path, fileNameEx);
//   }
// 
//   public List<String> getImports() {
//     return imports;
//   }
// 
//   public List<String> getFields() {
//     return fields;
//   }
// 
//   public List<Method> getMethods() {
//     return methods;
//   }
// 
//   public void replaceImportStrings(String reg, String applicationId) {
//     for (int i = 0, li = imports.size(); i < li; i++) {
//       imports.set(i, imports.get(i).replace(reg, applicationId));
//     }
//   }
// 
//   @Override
//   public String toString() {
//     return super.toString() + ", JavaConfig{" +
//         "imports=" + imports +
//         ", fields=" + fields +
//         ", methods=" + methods +
//         '}';
//   }
// }
// 
// Path: ask-app/src/main/java/com/androidstarterkit/injection/model/ManifestConfig.java
// public class ManifestConfig extends Config {
//   @SerializedName("element")
//   private List<ManifestElement> manifestElements;
// 
//   public ManifestConfig(String path, String fileNameEx) {
//     super(path, fileNameEx);
//   }
// 
//   public List<ManifestElement> getManifestElements() {
//     return manifestElements;
//   }
// 
//   @Override
//   public String toString() {
//     return "ManifestConfig{" +
//         "manifestElements=" + manifestElements +
//         '}';
//   }
// }


// Path: ask-app/src/main/java/com/androidstarterkit/injection/ModuleLoader.java
import com.androidstarterkit.injection.model.Config;
import com.androidstarterkit.injection.model.GradleConfig;
import com.androidstarterkit.injection.model.JavaConfig;
import com.androidstarterkit.injection.model.ManifestConfig;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

package com.androidstarterkit.injection;




public class ModuleLoader {

  private List<CodeGenerator> codeGenerators;

  public ModuleLoader() {
    codeGenerators = new ArrayList<>();
  }

  public void generateCode() {
    codeGenerators.forEach(CodeGenerator::apply);
  }

  public void addCodeGenerator(CodeGenerator codeGenerator) {
    if (!codeGenerators.contains(codeGenerator)) {
      codeGenerators.add(codeGenerator);
    }
  }

  public void addManifestConfigs(List<ManifestConfig> configs) {
    if (configs != null) {
      configs.forEach(this::addConfig);
    }
  }

  public void addJavaConfigs(List<JavaConfig> configs) {