// Copyright 2006, 2007 The Apache Software Foundation
//
// 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.tapestry.services;

import org.apache.tapestry.ioc.ObjectLocator;
import org.apache.tapestry.model.MutableComponentModel;

/**
 * Provides some form of injection when the value for an {@link org.apache.tapestry.ioc.annotation.Inject} annotation is
 * present. In this case, the provider is responsible for determining the value to be injected from the field name and
 * field type.
 * <p/>
 * This interface will be used as part of a {@link org.apache.tapestry.ioc.services.ChainBuilder chain of command}.
 */
public interface InjectionProvider
{
    /**
     * Peform the injection, if possible. Most often, this will result in a call to {@link
     * ClassTransformation#injectField(String, Object)}. The caller is responsible for invoking {@link
     * ClassTransformation#claimField(String, Object)}.
     *
     * @param fieldName      the name of the field requesting injection
     * @param fieldType      the type of the field
     * @param locator        allows services to be located
     * @param transformation allows the code for the class to be transformed
     * @param componentModel defines the relevant aspects of the component
     * @return true if an injection has been made (terminates the command chain), false to continue down the chain
     */
    boolean provideInjection(String fieldName, Class fieldType, ObjectLocator locator,
                             ClassTransformation transformation, MutableComponentModel componentModel);
}
