Can I use [Dagger](http://square.github.io/dagger/) to inject different values into several instances of the same class that are deep inside the object graph? I want to avoid passing the values through the containing objects in the graph (so I can change the implementation of the contained objects without affecting their containers).

Here's a contrived example. The object graph is a Top, which contains a Left and Right, which each contain a Show. So there are two instances of Show.

```
class Top {
  Left left;
  Right right;
  void encodeTwice(String data) {
    left.encode(data);
    right.encode(data.getBytes());
  }
}
class Left {
  Leaf leaf;
  void encode(String data) {
    leaf.write(URLEncoder.encode(data));
  }
}
class Right {
  Leaf leaf;
  void encode(byte[] data) {
    leaf.write(DatatypeConverter.printBase64Binary(data));
  }
}
interface Leaf {
  void write(String data);
}
class Show implements Leaf {
  String label;
  @Override public void write(String data) {
    System.out.println(label + ": " + data);
  }
}
// There might be other classes that implement Leaf.

```

Can I use Dagger to inject different values into Top.left.leaf.label and Top.right.leaf.label?

Here's one attempt. This is unsatisfactory, because Left and Right depend on the implementation of Leaf. I want to inject Show.label without involving Left or Right.

```
ObjectGraph.create(new TopModule()).get(Top.class).encodeTwice("Hello!");

@Module(injects = Top.class)
public class TopModule {
  @Provides @Named("Left.leaf.label") String provideLeftLabel() {
    return "URL encoded";
  }
  @Provides @Named("Right.leaf.label") String provideRightLabel() {
    return "Base 64";
  }
}
class Top {
  @Inject Left left;
  @Inject Right right;
  void encodeTwice(String data) {
    left.encode(data);
    right.encode(data.getBytes());
  }
}
class Left {
  Leaf leaf;
  @Inject Left(@Named("Left.leaf.label") String label) {
    leaf = new Show(label);
  }
  void encode(String data) {
    leaf.write(URLEncoder.encode(data));
  }
}
class Right {
  Leaf leaf;
  @Inject Right(@Named("Right.leaf.label") String label) {
    leaf = new Show(label);
  }
  void encode(byte[] data) {
    leaf.write(DatatypeConverter.printBase64Binary(data));
  }
}
interface Leaf {
  void write(String data);
}
class Show implements Leaf {
  String label;
  Show(String label) {
    this.label = label;
  }
  @Override public void write(String data) {
    System.out.println(label + ": " + data);
  }
}

```