content: /*
   * Copyright ©2015-2023 Jaemon. All Rights Reserved.
   *
   * Licensed 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 com.github.jaemon.dinger.core.annatations;
  
  import com.github.jaemon.dinger.core.spring.DingerScannerRegistrar;
  import org.springframework.beans.factory.support.BeanNameGenerator;
  import org.springframework.context.annotation.Import;
  
  import java.lang.annotation.*;
  
  /**
   * DingerScan
   *
   * @author Jaemon
   * @since 1.0
   */
  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.TYPE)
  @Documented
  @Import(DingerScannerRegistrar.class)
  public @interface DingerScan {
      /**
       * Alias for the {@link #basePackages()} attribute. Allows for more concise
       * annotation declarations e.g.:
       * {@code @DingerScan("org.my.pkg")} instead of {@code @DingerScan(basePackages = "org.my.pkg"})}.
       *
       * @return base package names
       */
      String[] value() default {};
  
      /**
       * Base packages to scan for Dinger interfaces. Note that only interfaces
       * with at least one method will be registered; concrete classes will be
       * ignored.
       *
       * @return base package names for scanning dinger interface
       */
      String[] basePackages() default {};
  
      /**
       * The {@link BeanNameGenerator} class to be used for naming detected components
       * within the Spring container.
       *
       * @return the class of {@link BeanNameGenerator}
       */
      Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
  
      /**
       * This property specifies the annotation that the scanner will search for.
       * <p>
       * The scanner will register all interfaces in the base package that also have
       * the specified annotation.
       * <p>
       * Note this can be combined with markerInterface.
       *
       * @return the annotation that the scanner will search for
       */
      Class<? extends Annotation> annotationClass() default Annotation.class;
  
      /**
       * This property specifies the parent that the scanner will search for.
       * <p>
       * The scanner will register all interfaces in the base package that also have
       * the specified interface class as a parent.
       * <p>
       * Note this can be combined with annotationClass.
       *
       * @return the parent that the scanner will search for
       */
      Class<?> markerInterface() default Class.class;
  }
  