// Path: src/main/java/com/github/easyjsonapi/core/EasyJsonApiConfig.java
// public class EasyJsonApiConfig {
// 
//     private Map<EasyJsonApiTypeToken, List<Class<?>>> classesParsed = new HashMap<>();
// 
//     private String[] packagesSearched;
// 
//     /**
//      * The default constructor
//      */
//     public EasyJsonApiConfig() {}
// 
//     /**
//      * The constructor with packages attributes
//      * 
//      * @param packages
//      *            the packages needs to be search and parsing
//      * @throws EasyJsonApiInvalidPackageException
//      */
//     public EasyJsonApiConfig(String... packages) throws EasyJsonApiInvalidPackageException {
//         setPackagesToSearch(packages);
//     }
// 
//     /**
//      * Get the array with all classes parsed
//      * 
//      * @return the classesParsed the classes parsed
//      */
//     public Map<EasyJsonApiTypeToken, List<Class<?>>> getClassesParsed() {
//         return classesParsed;
//     }
// 
//     /**
//      * Get the array with packages searched
//      * 
//      * @return the packagesSearched the packages searched
//      */
//     public String[] getPackagesSearched() {
//         return packagesSearched;
//     }
// 
//     /**
//      * Set the packages to search
//      * 
//      * @param packages
//      *            the packages needs to be search and parsing
//      * @throws EasyJsonApiInvalidPackageException
//      */
//     public void setPackagesToSearch(String... packages) throws EasyJsonApiInvalidPackageException {
// 
//         this.packagesSearched = packages;
// 
//         for (String packageToSearch : packages) {
//             try {
//                 ClassPath classpath = ClassPath.from(getClass().getClassLoader());
// 
//                 List<Class<?>> attrClasses = new ArrayList<>();
//                 List<Class<?>> metaClasses = new ArrayList<>();
//                 List<Class<?>> metaRelationshipsClasses = new ArrayList<>();
// 
//                 for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses(packageToSearch)) {
// 
//                     Class<?> clazz = classInfo.load();
// 
//                     if (Assert.notNull(clazz.getAnnotation(Attributes.class))) {
//                         attrClasses.add(clazz);
//                     } else if (Assert.notNull(clazz.getAnnotation(Meta.class))) {
//                         metaClasses.add(clazz);
//                     } else if (Assert.notNull(clazz.getAnnotation(MetaRelationship.class))) {
//                         metaRelationshipsClasses.add(clazz);
//                     }
//                 }
// 
//                 this.classesParsed.put(EasyJsonApiTypeToken.TOKEN_ATTR, attrClasses);
//                 this.classesParsed.put(EasyJsonApiTypeToken.TOKEN_META, metaClasses);
//                 this.classesParsed.put(EasyJsonApiTypeToken.TOKEN_META_RELATIONSHIP, metaRelationshipsClasses);
// 
//             } catch (IOException ex) {
//                 throw new EasyJsonApiInvalidPackageException("Invalid packages inserted!", ex);
//             }
//         }
//     }
// 
// }


import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.github.easyjsonapi.core.EasyJsonApiConfig;
import com.google.gson.reflect.TypeToken;
            } else {
                this.classesUsedInJson.addAll(Arrays.asList(clazz));
                this.classesUsedInJson.retainAll(Arrays.asList(clazz));
            }
        }

        if (this.config.getClassesParsed().isEmpty()) {
            // Use Map structure to support the default configuration
            Type mapType = TypeToken.get(Map.class).getType();
            this.tokenTypesToUse.put(EasyJsonApiTypeToken.TOKEN_DEFAULT, mapType);
        } else {
            for (Map.Entry<EasyJsonApiTypeToken, List<Class<?>>> clazzMapping : this.config.getClassesParsed().entrySet()) {
                List<Class<?>> classes = clazzMapping.getValue();

                for (Class<?> cla : classes) {
                    if (this.classesUsedInJson.contains(cla)) {
                        Type classType = TypeToken.get(cla).getType();
                        this.tokenTypesToUse.put(clazzMapping.getKey(), classType);
                    }
                }
            }
        }
    }

    /**
     * Set the {@link EasyJsonApiConfig}
     * 
     * @param config
     *            the configuration
     */
// Path: src/main/java/com/github/easyjsonapi/core/EasyJsonApiConfig.java
// public class EasyJsonApiConfig {
// 
//     private Map<EasyJsonApiTypeToken, List<Class<?>>> classesParsed = new HashMap<>();
// 
//     private String[] packagesSearched;
// 
//     /**
//      * The default constructor
//      */
//     public EasyJsonApiConfig() {}
// 
//     /**
//      * The constructor with packages attributes
//      * 
//      * @param packages
//      *            the packages needs to be search and parsing
//      * @throws EasyJsonApiInvalidPackageException
//      */
//     public EasyJsonApiConfig(String... packages) throws EasyJsonApiInvalidPackageException {
//         setPackagesToSearch(packages);
//     }
// 
//     /**
//      * Get the array with all classes parsed
//      * 
//      * @return the classesParsed the classes parsed
//      */
//     public Map<EasyJsonApiTypeToken, List<Class<?>>> getClassesParsed() {
//         return classesParsed;
//     }
// 
//     /**
//      * Get the array with packages searched
//      * 
//      * @return the packagesSearched the packages searched
//      */
//     public String[] getPackagesSearched() {
//         return packagesSearched;
//     }
// 
//     /**
//      * Set the packages to search
//      * 
//      * @param packages
//      *            the packages needs to be search and parsing
//      * @throws EasyJsonApiInvalidPackageException
//      */
//     public void setPackagesToSearch(String... packages) throws EasyJsonApiInvalidPackageException {
// 
//         this.packagesSearched = packages;
// 
//         for (String packageToSearch : packages) {
//             try {
//                 ClassPath classpath = ClassPath.from(getClass().getClassLoader());
// 
//                 List<Class<?>> attrClasses = new ArrayList<>();
//                 List<Class<?>> metaClasses = new ArrayList<>();
//                 List<Class<?>> metaRelationshipsClasses = new ArrayList<>();
// 
//                 for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses(packageToSearch)) {
// 
//                     Class<?> clazz = classInfo.load();
// 
//                     if (Assert.notNull(clazz.getAnnotation(Attributes.class))) {
//                         attrClasses.add(clazz);
//                     } else if (Assert.notNull(clazz.getAnnotation(Meta.class))) {
//                         metaClasses.add(clazz);
//                     } else if (Assert.notNull(clazz.getAnnotation(MetaRelationship.class))) {
//                         metaRelationshipsClasses.add(clazz);
//                     }
//                 }
// 
//                 this.classesParsed.put(EasyJsonApiTypeToken.TOKEN_ATTR, attrClasses);
//                 this.classesParsed.put(EasyJsonApiTypeToken.TOKEN_META, metaClasses);
//                 this.classesParsed.put(EasyJsonApiTypeToken.TOKEN_META_RELATIONSHIP, metaRelationshipsClasses);
// 
//             } catch (IOException ex) {
//                 throw new EasyJsonApiInvalidPackageException("Invalid packages inserted!", ex);
//             }
//         }
//     }
// 
// }


// Path: src/main/java/com/github/easyjsonapi/adapters/EasyJsonApiMachine.java
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.github.easyjsonapi.core.EasyJsonApiConfig;
import com.google.gson.reflect.TypeToken;

            } else {
                this.classesUsedInJson.addAll(Arrays.asList(clazz));
                this.classesUsedInJson.retainAll(Arrays.asList(clazz));
            }
        }

        if (this.config.getClassesParsed().isEmpty()) {
            // Use Map structure to support the default configuration
            Type mapType = TypeToken.get(Map.class).getType();
            this.tokenTypesToUse.put(EasyJsonApiTypeToken.TOKEN_DEFAULT, mapType);
        } else {
            for (Map.Entry<EasyJsonApiTypeToken, List<Class<?>>> clazzMapping : this.config.getClassesParsed().entrySet()) {
                List<Class<?>> classes = clazzMapping.getValue();

                for (Class<?> cla : classes) {
                    if (this.classesUsedInJson.contains(cla)) {
                        Type classType = TypeToken.get(cla).getType();
                        this.tokenTypesToUse.put(clazzMapping.getKey(), classType);
                    }
                }
            }
        }
    }

    /**
     * Set the {@link EasyJsonApiConfig}
     * 
     * @param config
     *            the configuration
     */
    public final void setConfig(EasyJsonApiConfig config) {