001    // Copyright 2007, 2009, 2011 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    // http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.ioc;
016    
017    import org.apache.tapestry5.ioc.annotations.EagerLoad;
018    import org.apache.tapestry5.ioc.annotations.Scope;
019    
020    import java.lang.annotation.Annotation;
021    
022    /**
023     * Allows additional options for a service to be specified, overriding hard coded defaults or defaults from annotations
024     * on the service.
025     *
026     * @see org.apache.tapestry5.ioc.def.ServiceDef2
027     */
028    public interface ServiceBindingOptions
029    {
030        /**
031         * Allows a specific service id for the service to be provided, rather than the default (from the service
032         * interface). This is useful when multiple services implement the same interface, since service ids must be
033         * unique.
034         *
035         * @param id
036         * @return this binding options, for further configuration
037         */
038        ServiceBindingOptions withId(String id);
039    
040        /**
041         * Uses the the simple (unqualified) class name of the implementation class as the id of the service.
042         *
043         * @return this binding options, for further configuration
044         * @throws IllegalStateException if the class name was not defined (via {@link ServiceBinder#bind(Class, Class)} or
045         *                               {@link ServiceBinder#bind(Class)}).
046         * @since 5.3
047         */
048        ServiceBindingOptions withSimpleId();
049    
050        /**
051         * Sets the scope of the service, overriding the {@link Scope} annotation on the service implementation class.
052         *
053         * @param scope
054         * @return this binding options, for further configuration
055         * @see org.apache.tapestry5.ioc.ScopeConstants
056         */
057        ServiceBindingOptions scope(String scope);
058    
059        /**
060         * Turns eager loading on for this service. This may also be accomplished using the {@link EagerLoad} annotation on
061         * the service implementation class.
062         *
063         * @return this binding options, for further configuration
064         */
065        ServiceBindingOptions eagerLoad();
066    
067        /**
068         * Disallows service decoration for this service.
069         *
070         * @return this binding options, for further configuration
071         */
072        ServiceBindingOptions preventDecoration();
073    
074        /**
075         * Identifies a service for which live class reloading is not desired. This primarily applies to certain
076         * internal Tapestry services, and is necessary during the development of Tapestry itself. In user applications,
077         * services defined in library modules are not subject to reloading because the class files are stored in JARs, not
078         * as local file system files.
079         *
080         * @since 5.2.0
081         */
082        ServiceBindingOptions preventReloading();
083    
084        /**
085         * Defines the marker interface(s) for the service, used to connect injections by type at the point of injection
086         * with a particular service implementation, based on the intersection of type and marker interface. The containing
087         * module will sometimes provide a set of default marker annotations for all services within the module, this method
088         * allows that default to be extended.
089         *
090         * @param <T>
091         * @param marker one or more markers to add
092         * @return this binding options, for further configuration
093         */
094        <T extends Annotation> ServiceBindingOptions withMarker(Class<T>... marker);
095    }