@@ -0,0 +1,1473 @@
+package org.realityforge.replicant.client;%0A%0Aimport java.util.ArrayList;%0Aimport java.util.List;%0Aimport javax.annotation.Nonnull;%0Aimport javax.annotation.Nullable;%0Aimport static org.realityforge.braincheck.Guards.*;%0A%0A/**%0A * A basic EntityLocator implementation that allows explicit per-type registration%0A */%0Apublic class AggregateEntityLocator%0A  implements EntityLocator%0A%7B%0A  private final ArrayList%3CEntityLocator%3E _entityLocators = new ArrayList%3C%3E();%0A%0A  protected final %3CT%3E void registerEntityLocator( @Nonnull final EntityLocator entityLocator )%0A  %7B%0A    apiInvariant( () -%3E !_entityLocators.contains( entityLocator ),%0A                  () -%3E %22Attempting to register entityLocator %22 + entityLocator + %22 when already present.%22 );%0A    _entityLocators.add( entityLocator );%0A  %7D%0A%0A  /**%0A   * %7B@inheritDoc%7D%0A   */%0A  @Nullable%0A  @Override%0A  public final %3CT%3E T findByID( @Nonnull final Class%3CT%3E type, @Nonnull final Object id )%0A  %7B%0A    for ( final EntityLocator entityLocator : _entityLocators )%0A    %7B%0A      final T entity = entityLocator.findByID( type, id );%0A      if ( null != entity )%0A      %7B%0A        return entity;%0A      %7D%0A    %7D%0A    return null;%0A  %7D%0A%0A  /**%0A   * %7B@inheritDoc%7D%0A   */%0A  @Nonnull%0A  @Override%0A  public %3CT%3E List%3CT%3E findAll( @Nonnull final Class%3CT%3E type )%0A  %7B%0A    final ArrayList%3CT%3E results = new ArrayList%3C%3E();%0A    for ( final EntityLocator entityLocator : _entityLocators )%0A    %7B%0A      results.addAll( entityLocator.findAll( type ) );%0A    %7D%0A    return results;%0A  %7D%0A%7D%0A

Add locator that will delegate to list of locators