package com.google.inject;

import com.google.inject.binder.LinkedBindingBuilder;

/**
 * Links one binding to another.
 */
class LinkedBindingBuilderImpl<T> implements LinkedBindingBuilder<T> {

  final Key<T> key;
  Key<? extends T> destination;
  Object source = BinderImpl.UNKNOWN_SOURCE;
  private BinderImpl binder;

  LinkedBindingBuilderImpl(BinderImpl binder, Key<T> key) {
    this.binder = binder;
    this.key = key;
  }

  Object getSource() {
    return source;
  }

  Key<T> getKey() {
    return key;
  }

  Key<? extends T> getDestination() {
    return destination;
  }

  LinkedBindingBuilderImpl<T> from(Object source) {
    this.source = source;
    return this;
  }

  public void to(Key<? extends T> destination) {
    if (this.destination != null) {
      binder.addError(source, ErrorMessages.LINK_DESTINATION_ALREADY_SET);
    } else {
      this.destination = destination;
    }
  }

  public void to(Class<? extends T> destination) {
    to(Key.get(destination));
  }

  public void to(TypeLiteral<? extends T> destination) {
    to(Key.get(destination));
  }
}
