@startuml
package com.iluwatar.dependency.injection {
  class AdvancedSorceress {
    - tobacco : Tobacco
    + AdvancedSorceress()
    + setTobacco(tobacco : Tobacco)
    + smoke()
  }
  class AdvancedWizard {
    - tobacco : Tobacco
    + AdvancedWizard(tobacco : Tobacco)
    + smoke()
  }
  class App {
    + App()
    + main(args : String[]) {static}
  }
  class GuiceWizard {
    - tobacco : Tobacco
    + GuiceWizard(tobacco : Tobacco)
    + smoke()
  }
  class OldTobyTobacco {
    + OldTobyTobacco()
  }
  class RivendellTobacco {
    + RivendellTobacco()
  }
  class SecondBreakfastTobacco {
    + SecondBreakfastTobacco()
  }
  class SimpleWizard {
    - tobacco : OldTobyTobacco
    + SimpleWizard()
    + smoke()
  }
  abstract class Tobacco {
    - LOGGER : Logger {static}
    + Tobacco()
    + smoke(wizard : Wizard)
  }
  interface Wizard {
    + smoke() {abstract}
  }
}
AdvancedSorceress -->  "-tobacco" Tobacco
SimpleWizard -->  "-tobacco" OldTobyTobacco
AdvancedWizard -->  "-tobacco" Tobacco
GuiceWizard -->  "-tobacco" Tobacco
AdvancedSorceress ..|> Wizard 
AdvancedWizard ..|> Wizard 
GuiceWizard ..|> Wizard 
OldTobyTobacco --|> Tobacco 
RivendellTobacco --|> Tobacco 
SecondBreakfastTobacco --|> Tobacco 
SimpleWizard ..|> Wizard 
@enduml