10b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle/**
20b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * Copyright (C) 2015 Google Inc.
30b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle *
40b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * Licensed under the Apache License, Version 2.0 (the "License");
50b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * you may not use this file except in compliance with the License.
60b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * You may obtain a copy of the License at
70b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle *
80b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * http://www.apache.org/licenses/LICENSE-2.0
90b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle *
100b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * Unless required by applicable law or agreed to in writing, software
110b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * distributed under the License is distributed on an "AS IS" BASIS,
120b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * See the License for the specific language governing permissions and
140b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * limitations under the License.
150b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle */
160b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
170b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellepackage com.google.inject.spi;
180b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
190b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleimport static com.google.common.base.Preconditions.checkNotNull;
200b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
210b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleimport com.google.inject.Binder;
220b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleimport com.google.inject.internal.Errors;
230b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
240b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle/**
250b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * Represents a call to {@link Binder#scanModulesForAnnotatedMethods} in a module.
260b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle *
270b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * @author sameb@google.com (Sam Berlin)
280b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle * @since 4.0
290b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle */
300b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellepublic final class ModuleAnnotatedMethodScannerBinding implements Element {
310b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  private final Object source;
320b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  private final ModuleAnnotatedMethodScanner scanner;
330b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
340b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  public ModuleAnnotatedMethodScannerBinding(Object source, ModuleAnnotatedMethodScanner scanner) {
350b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    this.source = checkNotNull(source, "source");
360b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    this.scanner = checkNotNull(scanner, "scanner");
370b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
380b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
390b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  public Object getSource() {
400b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    return source;
410b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
420b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
430b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  public ModuleAnnotatedMethodScanner getScanner() {
440b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    return scanner;
450b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
460b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
470b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  public <T> T acceptVisitor(ElementVisitor<T> visitor) {
480b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    return visitor.visit(this);
490b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
500b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
510b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  public void applyTo(Binder binder) {
520b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    binder.withSource(getSource()).scanModulesForAnnotatedMethods(scanner);
530b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
540b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
550b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  @Override public String toString() {
560b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    return scanner + " which scans for " + scanner.annotationClasses()
570b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle        + " (bound at " + Errors.convert(source) + ")";
580b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
590b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
600b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle