// Path: src/main/java/com/lowereast/guiceymongo/data/IsData.java
// public interface IsData {
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface BucketConfiguration {
// 	BucketOptionConfiguration to(String bucket);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface BucketOptionConfiguration {
// 	FinishableConfiguration inDatabase(String databaseKey);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface CollectionConfiguration extends CollectionConfigurationOnlyTo {
// 	CollectionConfigurationOnlyTo ofType(Class<? extends IsData> dataType);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface CollectionConfigurationOnlyTo {
// 	CollectionOptionConfiguration to(String collection);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface DatabaseConfiguration {
// 	DatabaseOptionConfiguration to(String database);
//        DatabaseOptionConfiguration asTestDatabase();
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface DatabaseOptionConfiguration extends FinishableConfiguration, Module {
// 	FinishableConfiguration overConnection(String connectionKey);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface FinishableConfiguration extends Module {
// 	DatabaseConfiguration mapDatabase(String databaseKey);
// 	CollectionConfiguration mapCollection(String collectionKey);
// 	BucketConfiguration mapBucket(String bucketKey);
// }


import com.google.inject.Binder;
import com.google.inject.Module;
import com.lowereast.guiceymongo.data.IsData;
import com.lowereast.guiceymongo.guice.spi.Builders.BucketConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.BucketOptionConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.CollectionConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.CollectionConfigurationOnlyTo;
import com.lowereast.guiceymongo.guice.spi.Builders.DatabaseConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.DatabaseOptionConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.FinishableConfiguration;

		public Configuration(String name) {
			_name = name;
		}
		public Module cloneFrom(String configurationName) {
			_collector.bindClonedConfiguration(_name, configurationName);
			return this;
		}
		public Builders.CollectionConfiguration mapCollection(String collectionKey) {
			return new Collection(this, collectionKey);
		}
		public Builders.DatabaseConfiguration mapDatabase(String databaseKey) {
			return new Database(this, databaseKey);
		}
		public BucketConfiguration mapBucket(String bucketKey) {
			return new Bucket(this, bucketKey);
		}
		
		public void configure(Binder binder) {
			new GuiceyMongoBinder(binder.skipSources(Configuration.class, Database.class, Collection.class)).bind(_collector);
		}
		
		String getName() {
			return _name;
		}
		GuiceyMongoBindingCollector getCollector() {
			return _collector;
		}
	}
	
// Path: src/main/java/com/lowereast/guiceymongo/data/IsData.java
// public interface IsData {
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface BucketConfiguration {
// 	BucketOptionConfiguration to(String bucket);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface BucketOptionConfiguration {
// 	FinishableConfiguration inDatabase(String databaseKey);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface CollectionConfiguration extends CollectionConfigurationOnlyTo {
// 	CollectionConfigurationOnlyTo ofType(Class<? extends IsData> dataType);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface CollectionConfigurationOnlyTo {
// 	CollectionOptionConfiguration to(String collection);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface DatabaseConfiguration {
// 	DatabaseOptionConfiguration to(String database);
//        DatabaseOptionConfiguration asTestDatabase();
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface DatabaseOptionConfiguration extends FinishableConfiguration, Module {
// 	FinishableConfiguration overConnection(String connectionKey);
// }
// 
// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/Builders.java
// public interface FinishableConfiguration extends Module {
// 	DatabaseConfiguration mapDatabase(String databaseKey);
// 	CollectionConfiguration mapCollection(String collectionKey);
// 	BucketConfiguration mapBucket(String bucketKey);
// }


// Path: src/main/java/com/lowereast/guiceymongo/guice/spi/BuilderImpls.java
import com.google.inject.Binder;
import com.google.inject.Module;
import com.lowereast.guiceymongo.data.IsData;
import com.lowereast.guiceymongo.guice.spi.Builders.BucketConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.BucketOptionConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.CollectionConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.CollectionConfigurationOnlyTo;
import com.lowereast.guiceymongo.guice.spi.Builders.DatabaseConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.DatabaseOptionConfiguration;
import com.lowereast.guiceymongo.guice.spi.Builders.FinishableConfiguration;


		public Configuration(String name) {
			_name = name;
		}
		public Module cloneFrom(String configurationName) {
			_collector.bindClonedConfiguration(_name, configurationName);
			return this;
		}
		public Builders.CollectionConfiguration mapCollection(String collectionKey) {
			return new Collection(this, collectionKey);
		}
		public Builders.DatabaseConfiguration mapDatabase(String databaseKey) {
			return new Database(this, databaseKey);
		}
		public BucketConfiguration mapBucket(String bucketKey) {
			return new Bucket(this, bucketKey);
		}
		
		public void configure(Binder binder) {
			new GuiceyMongoBinder(binder.skipSources(Configuration.class, Database.class, Collection.class)).bind(_collector);
		}
		
		String getName() {
			return _name;
		}
		GuiceyMongoBindingCollector getCollector() {
			return _collector;
		}
	}
	
	private static class Database implements Builders.DatabaseConfiguration, Builders.DatabaseOptionConfiguration {