176c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit/**
276c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * Copyright (C) 2008 Google Inc.
376c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit *
476c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * Licensed under the Apache License, Version 2.0 (the "License");
576c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * you may not use this file except in compliance with the License.
676c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * You may obtain a copy of the License at
776c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit *
876c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * http://www.apache.org/licenses/LICENSE-2.0
976c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit *
1076c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * Unless required by applicable law or agreed to in writing, software
1176c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * distributed under the License is distributed on an "AS IS" BASIS,
1276c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * See the License for the specific language governing permissions and
1476c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit * limitations under the License.
1576c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit */
1676c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
1776c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitpackage com.google.inject.internal;
1876c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
19b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport com.google.common.base.Objects;
20b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport com.google.common.collect.ImmutableSet;
2103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkitimport com.google.inject.Binder;
2276c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitimport com.google.inject.Injector;
2376c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitimport com.google.inject.Key;
2476c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitimport com.google.inject.spi.BindingTargetVisitor;
2576c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitimport com.google.inject.spi.Dependency;
2676c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitimport com.google.inject.spi.ExposedBinding;
27c3f928404a91cf837d809dcc465ba43442bc1198limpbizkitimport com.google.inject.spi.PrivateElements;
28b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
2976c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkitimport java.util.Set;
3076c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
315ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitpublic final class ExposedBindingImpl<T> extends BindingImpl<T> implements ExposedBinding<T> {
3276c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
33c3f928404a91cf837d809dcc465ba43442bc1198limpbizkit  private final PrivateElements privateElements;
3476c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
355ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkit  public ExposedBindingImpl(InjectorImpl injector, Object source, Key<T> key,
36c3f928404a91cf837d809dcc465ba43442bc1198limpbizkit      InternalFactory<T> factory, PrivateElements privateElements) {
3776c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit    super(injector, key, source, factory, Scoping.UNSCOPED);
38c3f928404a91cf837d809dcc465ba43442bc1198limpbizkit    this.privateElements = privateElements;
3976c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  }
4076c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
418996e8059681c083744df50c7ad9e007eda1f648limpbizkit  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
4203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return visitor.visit(this);
4376c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  }
4476c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
4576c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  public Set<Dependency<?>> getDependencies() {
4676c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit    return ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(Injector.class)));
4776c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  }
4876c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
49c3f928404a91cf837d809dcc465ba43442bc1198limpbizkit  public PrivateElements getPrivateElements() {
50c3f928404a91cf837d809dcc465ba43442bc1198limpbizkit    return privateElements;
5176c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  }
5276c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit
5376c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  @Override public String toString() {
54d9c913acca55023ef5d76a32c3d4a51ee6b420cbsberlin    return Objects.toStringHelper(ExposedBinding.class)
5576c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit        .add("key", getKey())
5676c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit        .add("source", getSource())
57c3f928404a91cf837d809dcc465ba43442bc1198limpbizkit        .add("privateElements", privateElements)
5876c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit        .toString();
5976c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit  }
6003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
6103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public void applyTo(Binder binder) {
6203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    throw new UnsupportedOperationException("This element represents a synthetic binding.");
6303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
647bcec8815e3cb9c4f910c4a9024af7a7e664c7a0sberlin@gmail.com
657bcec8815e3cb9c4f910c4a9024af7a7e664c7a0sberlin@gmail.com  // Purposely does not override equals/hashcode, because exposed bindings are only equal to
667bcec8815e3cb9c4f910c4a9024af7a7e664c7a0sberlin@gmail.com  // themselves right now -- that is, there cannot be "duplicate" exposed bindings.
6776c24b172e5c4c4b6d51c10dd5c1f491a4033157limpbizkit}
68