// Path: examples/coffee/src/main/java/com/wokdsem/examples/CoffeeMaker.java
// public class CoffeeMaker {
// 
// 	public static void main(String... args) {
// 		// Create injector
// 		CoffeeMakerModule module = new CoffeeMakerModule();                                // Root graph module
// 		Kinject kinject = Kinject.instantiate(CoffeeMakerModuleMapper.from(module));      // Instantiate injector
// 		// Injecting
// 		CoffeeMaker coffeeMaker = kinject.get(CoffeeMaker.class);						// Inject dependency
// 		coffeeMaker.makeCoffee();
// 	}
// 
// 	private final Heater heater;
// 	private final Pump pump;
// 
// 	public CoffeeMaker(Heater heater, Pump pump) {
// 		this.heater = heater;
// 		this.pump = pump;
// 	}
// 
// 	private void makeCoffee() {
// 		heater.heat();
// 		pump.pump();
// 		System.out.println(" [_]P coffee! ");
// 	}
// 
// }
// 
// Path: examples/coffee/src/main/java/com/wokdsem/examples/Heater.java
// public interface Heater {
// 
// 	void heat();
// 
// 	boolean isHot();
// 
// }
// 
// Path: examples/coffee/src/main/java/com/wokdsem/examples/Pump.java
// public interface Pump {
// 
// 	void pump();
// 
// }
// 
// Path: examples/coffee/src/main/java/com/wokdsem/examples/Thermosiphon.java
// public class Thermosiphon implements Pump {
// 
// 	private final Heater heater;
// 
// 	public Thermosiphon(Heater heater) {
// 		this.heater = heater;
// 	}
// 
// 	@Override
// 	public void pump() {
// 		if (heater.isHot()) System.out.println("=> => pumping => =>");
// 	}
// 
// }


import com.wokdsem.examples.CoffeeMaker;
import com.wokdsem.examples.Heater;
import com.wokdsem.examples.Pump;
import com.wokdsem.examples.Thermosiphon;
import com.wokdsem.kinject.annotations.Includes;
import com.wokdsem.kinject.annotations.Module;
import com.wokdsem.kinject.annotations.Provides;
import static com.wokdsem.kinject.annotations.Provides.Scope.SINGLETON;
package com.wokdsem.examples.modules;



@Module(completed = true)
public class CoffeeMakerModule {
	
	@Includes
	HeaterModule includeHeaterModule() {
		return new HeaterModule();
	}
	
	@Provides()
	Pump providePump(Heater heater) {
		return new Thermosiphon(heater);
	}
	
	@Provides(scope = SINGLETON)
	CoffeeMaker provideCoffeeMaker(Heater heater, Pump pump) {
// Path: examples/coffee/src/main/java/com/wokdsem/examples/CoffeeMaker.java
// public class CoffeeMaker {
// 
// 	public static void main(String... args) {
// 		// Create injector
// 		CoffeeMakerModule module = new CoffeeMakerModule();                                // Root graph module
// 		Kinject kinject = Kinject.instantiate(CoffeeMakerModuleMapper.from(module));      // Instantiate injector
// 		// Injecting
// 		CoffeeMaker coffeeMaker = kinject.get(CoffeeMaker.class);						// Inject dependency
// 		coffeeMaker.makeCoffee();
// 	}
// 
// 	private final Heater heater;
// 	private final Pump pump;
// 
// 	public CoffeeMaker(Heater heater, Pump pump) {
// 		this.heater = heater;
// 		this.pump = pump;
// 	}
// 
// 	private void makeCoffee() {
// 		heater.heat();
// 		pump.pump();
// 		System.out.println(" [_]P coffee! ");
// 	}
// 
// }
// 
// Path: examples/coffee/src/main/java/com/wokdsem/examples/Heater.java
// public interface Heater {
// 
// 	void heat();
// 
// 	boolean isHot();
// 
// }
// 
// Path: examples/coffee/src/main/java/com/wokdsem/examples/Pump.java
// public interface Pump {
// 
// 	void pump();
// 
// }
// 
// Path: examples/coffee/src/main/java/com/wokdsem/examples/Thermosiphon.java
// public class Thermosiphon implements Pump {
// 
// 	private final Heater heater;
// 
// 	public Thermosiphon(Heater heater) {
// 		this.heater = heater;
// 	}
// 
// 	@Override
// 	public void pump() {
// 		if (heater.isHot()) System.out.println("=> => pumping => =>");
// 	}
// 
// }


// Path: examples/coffee/src/main/java/com/wokdsem/examples/modules/CoffeeMakerModule.java
import com.wokdsem.examples.CoffeeMaker;
import com.wokdsem.examples.Heater;
import com.wokdsem.examples.Pump;
import com.wokdsem.examples.Thermosiphon;
import com.wokdsem.kinject.annotations.Includes;
import com.wokdsem.kinject.annotations.Module;
import com.wokdsem.kinject.annotations.Provides;
import static com.wokdsem.kinject.annotations.Provides.Scope.SINGLETON;

package com.wokdsem.examples.modules;



@Module(completed = true)
public class CoffeeMakerModule {
	
	@Includes
	HeaterModule includeHeaterModule() {
		return new HeaterModule();
	}
	
	@Provides()
	Pump providePump(Heater heater) {
		return new Thermosiphon(heater);
	}
	
	@Provides(scope = SINGLETON)
	CoffeeMaker provideCoffeeMaker(Heater heater, Pump pump) {
		return new CoffeeMaker(heater, pump);