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 extends Annotation> 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 extends Annotation> 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 extends T> 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 extends T> implementation) {
return to(Binding.to(implementation));
}
/**
* @see #to(Key)
*/
default ModuleBuilderBinder to(@NotNull Class extends T> 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 extends Supplier extends T>> supplierKey) {
return to(Binding.toSupplier(supplierKey));
}
/**
* @see #toSupplier(Key)
*/
default ModuleBuilderBinder toSupplier(@NotNull Class extends Supplier extends T>> 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 extends T> 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 extends T> 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 extends T> 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 extends T> 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 extends Annotation> 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();
}