/* * Copyright 2013 Atteo. * * 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 org.atteo.moonshine.services; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.google.inject.BindingAnnotation; import com.google.inject.Module; import com.google.inject.PrivateModule; /** * Makes the bindings from annotated service available to the local module. * * <p> * The annotation can be used in your service class on a field of {@link Service} type. * This will make all the bindings {@link PrivateModule#expose(Class) exposed} by the annotated service * available in this service {@link Module module} as private bindings. * </p> * <p> * You can additionally provide the {@link BindingAnnotation binding annotation} to register * imported bindings as annotated with this annotation. * </p> * <p> * Example: * <pre> * class Robot { * // First register LegServices, each provides binding for Leg class * @XmlIDREF * @ImportService(bindWith = Left.class) * LegService legService; * * @XmlIDREF * @ImportService(bindWith = Right.class) * LegService legService; * * // Then both Legs classes can be injected locally * @Inject * @Left * Leg leg; * * @Inject * @Right * Leg leg; * } * </pre> * </p> */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ImportService { /** * Annotation to bind imported bindings with. * <p> * By default bindings are imported without any binding annotation. * </p> */ Class<? extends Annotation> bindWith() default NoAnnotation.class; public @interface NoAnnotation { } }