/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.uima.fit.legacy.converter;

import java.lang.annotation.Annotation;
import java.lang.reflect.AccessibleObject;

import org.apache.uima.fit.legacy.AnnotationConverter;

/**
 * Abstract base class for annotation converters that do not require a context.
 */
public abstract class ContextlessAnnotationConverterBase<L extends Annotation, M extends Annotation>
        implements AnnotationConverter<L, M> {

  abstract M convert(L aAnnotation);
  
  public M convert(AccessibleObject aContext, L aAnnotation) {
    return convert(aAnnotation);
  }
  
  public M convert(Class<?> aContext, L aAnnotation) {
    return convert(aAnnotation);
  }
}
