/*******************************************************************************
 * Copyright (c) 2010, 2015 Sonatype, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Stuart McCulloch (Sonatype, Inc.) - initial API and implementation
 *******************************************************************************/
/**
 * Dynamic bean lookup across multiple injectors.
 * <p><p>
 * The {@link org.eclipse.sisu.inject.BeanLocator} lets you lookup and keep watch for bean implementations;
 * it does this by processing binding information from one or more {@code BindingPublisher}s, such as injectors.
 * <p><p>
 * You can add or remove {@link org.eclipse.sisu.inject.BindingPublisher}s using the {@link org.eclipse.sisu.inject.MutableBeanLocator}
 * view; any existing watchers or returned collections are updated to reflect the latest binding information.
 * <p><p>
 * {@link org.eclipse.sisu.inject.DefaultBeanLocator} will automatically add any injectors it's bound in by virtue
 * of an injected setter. This makes it easy to share across multiple injectors with a simple instance binding: 
 * 
 * <pre>
 * Module locatorModule = new AbstractModule() {
 *   private final DefaultBeanLocator locator = new DefaultBeanLocator();
 *   
 *   &#064;Override protected void configure() {
 *     bind( DefaultBeanLocator.class ).toInstance( locator );
 *   }
 * };
 * 
 * Injector injectorA = Guice.createInjector( new WireModule( locatorModule, spaceModuleA ) );   // adds injectorA to locator
 * Injector injectorB = Guice.createInjector( new WireModule( locatorModule, spaceModuleB ) );   // adds injectorB to locator</pre>
 * 
 * If you want to use a {@code DefaultBeanLocator} in a given injector, but don't want that injector
 * added automatically, wrap the locator inside a provider to hide the injected setter from Guice:
 * <p><p>
 * <pre>
 * bind( DefaultBeanLocator.class ).toProvider( Providers.of( locator ) );</pre>
 * 
 * By default all bindings in an injector are separated into two partitions (default vs non-default)
 * and ranked according to their sequence number. This is so bindings from multiple injectors can be
 * interleaved to keep default components prioritized before non-default, while still maintaining an
 * overall ordering between injectors. To override the default bind your own {@link org.eclipse.sisu.inject.RankingFunction}:
 * <p><p>
 * <pre>
 * bind( RankingFunction.class ).to( MyRankingFunction.class );</pre>
 */
package org.eclipse.sisu.inject;

