// 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.apache.tapestry5.ioc;

import org.apache.tapestry5.ioc.annotations.EagerLoad;
import org.apache.tapestry5.ioc.annotations.Scope;

import java.lang.annotation.Annotation;

/**
 * Allows additional options for a service to be specified, overriding hard coded defaults or defaults from annotations
 * on the service.
 *
 * @see org.apache.tapestry5.ioc.def.ServiceDef2
 */
public interface ServiceBindingOptions
{
    /**
     * Allows a specific service id for the service to be provided, rather than the default (from the service
     * interface). This is useful when multiple services implement the same interface, since service ids must be
     * unique.
     *
     * @param id
     * @return this binding options, for further configuration
     */
    ServiceBindingOptions withId(String id);

    /**
     * Uses the the simple (unqualified) class name of the implementation class as the id of the service.
     *
     * @return this binding options, for further configuration
     * @throws IllegalStateException if the class name was not defined (via {@link ServiceBinder#bind(Class, Class)} or
     *                               {@link ServiceBinder#bind(Class)}).
     * @since 5.3
     */
    ServiceBindingOptions withSimpleId();

    /**
     * Sets the scope of the service, overriding the {@link Scope} annotation on the service implementation class.
     *
     * @param scope
     * @return this binding options, for further configuration
     * @see org.apache.tapestry5.ioc.ScopeConstants
     */
    ServiceBindingOptions scope(String scope);

    /**
     * Turns eager loading on for this service. This may also be accomplished using the {@link EagerLoad} annotation on
     * the service implementation class.
     *
     * @return this binding options, for further configuration
     */
    ServiceBindingOptions eagerLoad();

    /**
     * Disallows service decoration for this service.
     *
     * @return this binding options, for further configuration
     */
    ServiceBindingOptions preventDecoration();

    /**
     * Identifies a service for which live class reloading is not desired. This primarily applies to certain
     * internal Tapestry services, and is necessary during the development of Tapestry itself. In user applications,
     * services defined in library modules are not subject to reloading because the class files are stored in JARs, not
     * as local file system files.
     *
     * @since 5.2.0
     */
    ServiceBindingOptions preventReloading();

    /**
     * Defines the marker interface(s) for the service, used to connect injections by type at the point of injection
     * with a particular service implementation, based on the intersection of type and marker interface. The containing
     * module will sometimes provide a set of default marker annotations for all services within the module, this method
     * allows that default to be extended.
     *
     * @param marker one or more markers to add
     * @return this binding options, for further configuration
     */
    ServiceBindingOptions withMarker(Class<? extends Annotation>... marker);
}
