All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.datakernel.di.module.ModuleBuilderBinder Maven / Gradle / Ivy

package io.datakernel.di.module;

import io.datakernel.di.annotation.EagerSingleton;
import io.datakernel.di.annotation.KeySetAnnotation;
import io.datakernel.di.annotation.NameAnnotation;
import io.datakernel.di.core.*;
import io.datakernel.di.util.Constructors.*;
import org.jetbrains.annotations.NotNull;

import java.lang.annotation.Annotation;
import java.util.function.Supplier;

public interface ModuleBuilderBinder extends ModuleBuilder {
	/**
	 * If bound key does not have a name already then sets it to a given one
	 */
	ModuleBuilderBinder named(@NotNull Name name);

	/**
	 * @see #named(Name)
	 */
	default ModuleBuilderBinder named(@NotNull String name) {
		return named(Name.of(name));
	}

	/**
	 * @see #named(Name)
	 */
	default ModuleBuilderBinder annotatedWith(@NotNull Annotation annotation) {
		return named(Name.of(annotation));
	}

	/**
	 * @see #named(Name)
	 */
	default ModuleBuilderBinder annotatedWith(@NotNull Class annotationType) {
		return named(Name.of(annotationType));
	}

	/**
	 * The binding being built by this builder will be added to the binding graph trie at given scope path
	 */
	ModuleBuilderBinder in(@NotNull Scope[] scope);

	/**
	 * @see #in(Scope[])
	 */
	ModuleBuilderBinder in(@NotNull Scope scope, @NotNull Scope... scopes);

	/**
	 * @see #in(Scope[])
	 */
	ModuleBuilderBinder in(@NotNull Class annotationClass, @NotNull Class... annotationClasses);

	/**
	 * Sets a binding which would be bound to a given key and added to the binding graph trie
	 */
	ModuleBuilderBinder to(@NotNull Binding binding);

	/**
	 * DSL shortcut for creating a binding that just calls a binding at given key
	 * and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder to(@NotNull Key implementation) {
		return to(Binding.to(implementation));
	}

	/**
	 * @see #to(Key)
	 */
	default ModuleBuilderBinder to(@NotNull Class implementation) {
		return to(Binding.to(implementation));
	}

	/**
	 * DSL shortcut for creating a binding from a given instance
	 * and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder toInstance(@NotNull T instance) {
		return to(Binding.toInstance(instance));
	}

	/**
	 * DSL shortcut for creating a binding that calls a supplier from binding at given key
	 * and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder toSupplier(@NotNull Key> supplierKey) {
		return to(Binding.toSupplier(supplierKey));
	}

	/**
	 * @see #toSupplier(Key)
	 */
	default ModuleBuilderBinder toSupplier(@NotNull Class> supplierType) {
		return to(Binding.toSupplier(supplierType));
	}

	// region public BuilderModule to(constructor*, dependencies...) { ... }

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder to(@NotNull ConstructorN factory, @NotNull Class[] dependencies) {
		return to(Binding.to(factory, dependencies));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder to(@NotNull ConstructorN factory, @NotNull Key[] dependencies) {
		return to(Binding.to(factory, dependencies));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder to(@NotNull ConstructorN factory, @NotNull Dependency[] dependencies) {
		return to(Binding.to(factory, dependencies));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default ModuleBuilderBinder to(@NotNull Constructor0 constructor) {
		return to(Binding.to(constructor));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor1 constructor,
			@NotNull Class dependency1) {
		return to(Binding.to(constructor, dependency1));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor2 constructor,
			@NotNull Class dependency1, @NotNull Class dependency2) {
		return to(Binding.to(constructor, dependency1, dependency2));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor3 constructor,
			@NotNull Class dependency1, @NotNull Class dependency2, @NotNull Class dependency3) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor4 constructor,
			@NotNull Class dependency1, @NotNull Class dependency2, @NotNull Class dependency3, @NotNull Class dependency4) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3, dependency4));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor5 constructor,
			@NotNull Class dependency1, @NotNull Class dependency2, @NotNull Class dependency3, @NotNull Class dependency4, @NotNull Class dependency5) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3, dependency4, dependency5));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor6 constructor,
			@NotNull Class dependency1, @NotNull Class dependency2, @NotNull Class dependency3, @NotNull Class dependency4, @NotNull Class dependency5, @NotNull Class dependency6) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3, dependency4, dependency5, dependency6));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor1 constructor,
			@NotNull Key dependency1) {
		return to(Binding.to(constructor, dependency1));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor2 constructor,
			@NotNull Key dependency1, @NotNull Key dependency2) {
		return to(Binding.to(constructor, dependency1, dependency2));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor3 constructor,
			@NotNull Key dependency1, @NotNull Key dependency2, @NotNull Key dependency3) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor4 constructor,
			@NotNull Key dependency1, @NotNull Key dependency2, @NotNull Key dependency3, @NotNull Key dependency4) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3, dependency4));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor5 constructor,
			@NotNull Key dependency1, @NotNull Key dependency2, @NotNull Key dependency3, @NotNull Key dependency4, @NotNull Key dependency5) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3, dependency4, dependency5));
	}

	/**
	 * DSL shortcut for creating a binding and {@link #to(Binding) binding it} to current key.
	 */
	default  ModuleBuilderBinder to(@NotNull Constructor6 constructor,
			@NotNull Key dependency1, @NotNull Key dependency2, @NotNull Key dependency3, @NotNull Key dependency4, @NotNull Key dependency5, @NotNull Key dependency6) {
		return to(Binding.to(constructor, dependency1, dependency2, dependency3, dependency4, dependency5, dependency6));
	}

	/**
	 * Adds bound key to a key set named with given name.
	 * 

* A key set is a special key of type Set<Key<?>> and name with annotation that is * marked with {@link KeySetAnnotation} instead of {@link NameAnnotation} * * @see KeySetAnnotation */ ModuleBuilderBinder as(@NotNull Name name); /** * @see #as(Name) */ default ModuleBuilderBinder as(@NotNull Class annotationType) { return as(Name.of(annotationType)); } /** * @see #as(Name) */ default ModuleBuilderBinder as(@NotNull Annotation annotation) { return as(Name.of(annotation)); } /** * @see #as(Name) */ default ModuleBuilderBinder as(@NotNull String name) { return as(Name.of(name)); } /** * A shortcut for as({@link EagerSingleton}.class) */ default ModuleBuilderBinder asEagerSingleton() { return as(EagerSingleton.class); } ModuleBuilderBinder export(); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy