103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit/**
203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * Copyright (C) 2009 Google Inc.
303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit *
403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * Licensed under the Apache License, Version 2.0 (the "License");
503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * you may not use this file except in compliance with the License.
603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * You may obtain a copy of the License at
703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit *
803b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * http://www.apache.org/licenses/LICENSE-2.0
903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit *
1003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * Unless required by applicable law or agreed to in writing, software
1103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * distributed under the License is distributed on an "AS IS" BASIS,
1203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * See the License for the specific language governing permissions and
1403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * limitations under the License.
1503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit */
1603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
1703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkitpackage com.google.inject.spi;
1803b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
1903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkitimport com.google.inject.Binder;
2003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkitimport com.google.inject.TypeLiteral;
2103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkitimport com.google.inject.matcher.Matcher;
2203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
2303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit/**
24ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit * Binds types (picked using a Matcher) to an type listener. Registrations are created explicitly in
25ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit * a module using {@link com.google.inject.Binder#bindListener(Matcher, TypeListener)} statements:
2603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit *
2703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * <pre>
28a843a95d620de9c8046e67a8f51619b3fedf77d3limpbizkit *     register(only(new TypeLiteral&lt;PaymentService&lt;CreditCard>>() {}), listener);</pre>
29a843a95d620de9c8046e67a8f51619b3fedf77d3limpbizkit *
30a843a95d620de9c8046e67a8f51619b3fedf77d3limpbizkit * @author jessewilson@google.com (Jesse Wilson)
31050d1f8e2b2dcd65567a965b295c1d51fb110e4alimpbizkit * @since 2.0
3203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit */
33ee79246d47f0e4a0a4f86543809135620487332dlimpbizkitpublic final class TypeListenerBinding implements Element {
3403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
35ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit  private final Object source;
36ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit  private final Matcher<? super TypeLiteral<?>> typeMatcher;
37ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit  private final TypeListener listener;
3803b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
39ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit  TypeListenerBinding(Object source, TypeListener listener,
4003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit      Matcher<? super TypeLiteral<?>> typeMatcher) {
4103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    this.source = source;
4203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    this.listener = listener;
4303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    this.typeMatcher = typeMatcher;
4403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
4503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
4603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  /** Returns the registered listener. */
47a843a95d620de9c8046e67a8f51619b3fedf77d3limpbizkit  public TypeListener getListener() {
4803b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return listener;
4903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
5003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
5103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  /** Returns the type matcher which chooses which types the listener should be notified of. */
5203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Matcher<? super TypeLiteral<?>> getTypeMatcher() {
5303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return typeMatcher;
5403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
5503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
5603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Object getSource() {
5703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return source;
5803b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
5903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
6003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public <T> T acceptVisitor(ElementVisitor<T> visitor) {
6103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return visitor.visit(this);
6203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
6303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
6403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public void applyTo(Binder binder) {
6503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    binder.withSource(getSource()).bindListener(typeMatcher, listener);
6603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
6703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit}
68