/**
   * Checks whether an adapter will match it's children.
   *
   * @param adapter
   * @return
   * @throws AdapterInitializationException
   */
  public boolean isWildcardAdapter(Class<? extends IAdapter> adapter)
      throws AdapterInitializationException {
    this.verifyAdapter(adapter);

    // get annotation
    return adapter.getAnnotation(AdapterDefinition.class).matchChildren();
  }
  /**
   * Checks whether the adapter is sharable.
   *
   * @param adapter
   * @return
   * @throws AdapterInitializationException
   */
  public boolean isTypeAdapterSharable(Class<? extends ITypeAdapter> adapter)
      throws AdapterInitializationException {
    this.verifyTypeAdapter(adapter);

    // check
    return adapter.getAnnotation(TypeAdapterDefinition.class).sharable();
  }
  /** {@inheritDoc} */
  @Override
  public void registerAdapter(Class<? extends IAdapter> adapter) throws ConfigurationException {
    this.verifyAdapter(adapter);

    // get annotation
    AdapterDefinition definition = adapter.getAnnotation(AdapterDefinition.class);

    // register adapter
    this.adapterMap.put(definition.input(), adapter);
  }
  /**
   * Constructs a new ConfigurationProcessor.
   *
   * @param processor
   */
  public AbstractMarshaller(ConfigurationProcessor processor, Class<T> type)
      throws ConfigurationException {
    this.processor = processor;

    // verify class
    if (!type.isAnnotationPresent(Configuration.class))
      throw new ConfigurationSetupException(
          "The supplied object is not setup for configuration marshalling.");

    // store arguments
    this.type = type;
    this.typeConfiguration = type.getAnnotation(Configuration.class);

    // create instances
    this.adapterMap = new HashMap<>();
    this.typeAdapterMap = new HashMap<>();
    this.adapterInstanceMap = new HashMap<>();
    this.typeAdapterInstanceMap = new HashMap<>();

    // register defaults
    this.registerAdapters();
  }