/**
 * File Name: fflib_ForceDiBindingResolver
 * Description: Application Binding Resolver using Force-DI
 *
 * @author: architect ir. Wilhelmus G.J. Velzeboer
 *
 * Redistribution and use in source and binary forms, with or without modification,
 *   are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above author notice,
 *      this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 *      this list of conditions and the following disclaimer in the documentation
 *      and/or other materials provided with the distribution.
 * - Neither the name of the author nor the names of its contributors
 *      may be used to endorse or promote products derived from this software without
 *      specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 *  THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 *  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
public with sharing class fflib_ForceDiBindingResolver
		implements fflib_BindingResolver
{
	/**
	 * Returns a new instance of the Apex class associated with the given Apex interface
	 *   Will return any mock implementation of the interface provided via setMock
	 *   Note that this method will not check the configured Apex class actually implements the interface
	 *
	 * @param serviceInterfaceType Apex interface type
	 *
	 * @exception Is thrown if there is no registered Apex class for the interface type
	 *
	 * @return Instance of the implementation bound to the given interface type
	 **/
	public Object newInstance(Type serviceInterfaceType)
	{
		return di_Injector.Org.getInstance(serviceInterfaceType);
	}

	/**
	 * Replaces the linked implementation for the Apex interface.
	 *
	 * @param serviceInterfaceType The interface type for this new implementation
	 * @param MockType The replacement implementation or Type name for the replacement
	 */
	public void replaceWith(Type serviceInterfaceType, Object MockType)
	{
		di_Injector.Org.Bindings.byName(serviceInterfaceType.getName()).replaceBindingWith(MockType);
	}

	// DEPRECATED - only available for backwards compatibility
	public void setMock(Type serviceInterfaceType, Object serviceImp)
	{
		replaceWith(serviceInterfaceType, serviceImp);
	}
}