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<PaymentService<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