private synchronized <T extends SchemaSourceRepresentation> void removeSource(
      final PotentialSchemaSource<?> source, final SchemaSourceRegistration<?> reg) {
    final Multimap<Class<? extends SchemaSourceRepresentation>, AbstractSchemaSourceRegistration<?>>
        m = sources.get(source.getSourceIdentifier());
    if (m != null) {
      m.remove(source.getRepresentation(), reg);

      for (SchemaListenerRegistration l : listeners) {
        l.getInstance().schemaSourceUnregistered(source);
      }

      if (m.isEmpty()) {
        sources.remove(source.getSourceIdentifier());
      }
    }
  }
  private synchronized <T extends SchemaSourceRepresentation> void addSource(
      final PotentialSchemaSource<T> source, final AbstractSchemaSourceRegistration<T> reg) {
    ListMultimap<Class<? extends SchemaSourceRepresentation>, AbstractSchemaSourceRegistration<?>>
        m = sources.get(source.getSourceIdentifier());
    if (m == null) {
      m = ArrayListMultimap.create();
      sources.put(source.getSourceIdentifier(), m);
    }

    m.put(source.getRepresentation(), reg);

    final Collection<PotentialSchemaSource<?>> reps =
        Collections.<PotentialSchemaSource<?>>singleton(source);
    for (SchemaListenerRegistration l : listeners) {
      l.getInstance().schemaSourceRegistered(reps);
    }
  }
  @Override
  public <T extends SchemaSourceRepresentation> SchemaSourceRegistration<T> registerSchemaSource(
      final SchemaSourceProvider<? super T> provider, final PotentialSchemaSource<T> source) {
    final PotentialSchemaSource<T> src = source.cachedReference();

    final AbstractSchemaSourceRegistration<T> ret =
        new AbstractSchemaSourceRegistration<T>(provider, src) {
          @Override
          protected void removeRegistration() {
            removeSource(src, this);
          }
        };

    addSource(src, ret);
    return ret;
  }