abstract class PluginDef[T] extends PluginBase with ModuleDef
Use it to define Plugins using izumi.distage.model.definition.dsl.ModuleDefDSL syntax
object MyPlugin extends PluginDef { include(myModule[F]) make[Xa[F]].from[Xa.Impl[F]] }
- Note
Since this is an abstract class, you cannot mix it with other classes or use it as a mixin. Instead, you may inherit from PluginBase, which is a trait – but in that case compile-time checks will not re-run when the class is updated in that case. Alternatively, you may use izumi.distage.model.definition.dsl.IncludesDSL#include to compose modules as values instead of using inheritance.
- See also
- Alphabetic
- By Inheritance
- PluginDef
- ModuleDef
- ModuleDefDSL
- TagsDSL
- IncludesDSL
- AbstractBindingDefDSL
- AbstractBindingDefDSLMacro
- Module
- PluginBase
- ModuleBase
- CachedHashcode
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new PluginDef()(implicit recompilationToken: ForcedRecompilationToken[T])
- recompilationToken
Makes compile-time checks re-run when the source code of this
PluginDef
is changed, if it's used in the checked role.
Type Members
- final class MutationContext extends AnyRef
Use this to create utility functions that add bindings mutably to the current module, as opposed to creating new modules and including them.
Use this to create utility functions that add bindings mutably to the current module, as opposed to creating new modules and including them.
Example:
import distage.{ClassConstructor, Tag, ModuleDef} import izumi.distage.model.definition.dsl.ModuleDefDSL trait RegisteredComponent class RegisteredComponentImpl extends RegisteredComponent def addAndRegister[T <: RegisteredComponent: Tag: ClassConstructor](implicit mutateModule: ModuleDefDSL#MutationContext): Unit = { new mutateModule.dsl { make[T] many[RegisteredComponent] .weak[T] } } new ModuleDef { addAndRegister[RegisteredComponentImpl] }
- Definition Classes
- AbstractBindingDefDSL
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def _initialIncludes: ArrayBuffer[Include]
- Attributes
- protected[this]
- Definition Classes
- IncludesDSL
- def _initialState: ArrayBuffer[BindingRef]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- def _initialTaggedIncludes: ArrayBuffer[IncludeApplyTags]
- Attributes
- protected[this]
- Definition Classes
- IncludesDSL
- def _initialTags: Set[BindingTag]
- Attributes
- protected[this]
- Definition Classes
- TagsDSL
- final def _make[T](provider: Functoid[T])(implicit arg0: Tag[T], pos: CodePositionMaterializer): MakeDSL[T]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- def _registered[T <: BindingRef](bindingRef: T): T
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- final def addImplicit[T](implicit arg0: Tag[T], instance: T, pos: CodePositionMaterializer): MakeDSLUnnamedAfterFrom[T]
Same as
make[T].from(implicitly[T])
*Same as
make[T].from(implicitly[T])
*- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- final def bindings: Set[Binding]
- Definition Classes
- ModuleDefDSL
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def equals(obj: Any): Boolean
- Definition Classes
- ModuleBase → AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def hash: Int
- Attributes
- protected
- Definition Classes
- ModuleBase → CachedHashcode
- final lazy val hashCode: Int
- Definition Classes
- CachedHashcode → AnyRef → Any
- final def include(that: ModuleBase): Unit
Add all bindings in
that
module intothis
moduleAdd all bindings in
that
module intothis
moduleWON'T add global tags from TagsDSL#tag to included bindings.
- Attributes
- protected[this]
- Definition Classes
- IncludesDSL
- final def includeApplyTags(that: ModuleBase): Unit
Add all bindings in
that
module intothis
moduleAdd all bindings in
that
module intothis
moduleWILL add global tags from TagsDSL#tag to included bindings.
- Attributes
- protected[this]
- Definition Classes
- IncludesDSL
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def iterator: Iterator[Binding]
- Definition Classes
- ModuleDefDSL
- final def keys: Set[DIKey]
- Definition Classes
- ModuleBase
- final def keysIterator: Iterator[DIKey]
- Definition Classes
- ModuleDefDSL
- final macro def make[T]: MakeDSL[T]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSLMacro
- final def makeFactory[T](implicit arg0: Tag[T], arg1: FactoryConstructor[T]): MakeDSLUnnamedAfterFrom[T]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- See also
- final def makeSubcontext[T](implicit arg0: Tag[T]): SubcontextDSL[T]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- See also
- final def makeSubcontext[T](submodule: ModuleBase)(implicit arg0: Tag[T]): SubcontextDSL[T]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- See also
- final def makeTrait[T](implicit arg0: Tag[T], arg1: TraitConstructor[T]): MakeDSLUnnamedAfterFrom[T]
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- See also
- final def many[T](implicit tag: Tag[Set[T]], pos: CodePositionMaterializer): SetDSL[T]
Set bindings are useful for implementing event listeners, plugins, hooks, http routes, etc.
Set bindings are useful for implementing event listeners, plugins, hooks, http routes, etc.
To define a multibinding use
.many
and.add
methods in ModuleDef DSL:import cats.effect._, org.http4s._, org.http4s.dsl.io._, scala.concurrent.ExecutionContext.Implicits.global import distage._ object HomeRouteModule extends ModuleDef { many[HttpRoutes[IO]].add { HttpRoutes.of[IO] { case GET -> Root / "home" => Ok(s"Home page!") } } }
Set bindings defined in different modules will be merged together into a single Set. You can summon a created Set by type
Set[T]
:import cats.implicits._, org.http4s.server.blaze._, org.http4s.implicits._ object BlogRouteModule extends ModuleDef { many[HttpRoutes[IO]].add { HttpRoutes.of[IO] { case GET -> Root / "blog" / post => Ok("Blog post ``$post''!") } } } class HttpServer(routes: Set[HttpRoutes[IO]]) { val router = routes.foldK def serve = BlazeBuilder[IO] .bindHttp(8080, "localhost") .mountService(router, "/") .start } val objects = Injector().produce(HomeRouteModule ++ BlogRouteModule) val server = objects.get[HttpServer] val testRouter = server.router.orNotFound testRouter.run(Request[IO](uri = uri("/home"))).flatMap(_.as[String]).unsafeRunSync // Home page! testRouter.run(Request[IO](uri = uri("/blog/1"))).flatMap(_.as[String]).unsafeRunSync // Blog post ``1''!
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- See also
Guice wiki on Multibindings: https://github.com/google/guice/wiki/Multibindings
- final def modify[T]: ModifyDSL[T, MakeDSL, MakeDSLUnnamedAfterFrom, SetDSL]
Modify a value bound at
T
.Modify a value bound at
T
. Modifiers stack and are all applied beforeT
is added to the object graph; only the final instance is observable.import distage.{Injector, ModuleDef} Injector().produceGet[Int](new ModuleDef { make[Int].from(1) modify[Int](_ + 1) modify[Int](_ + 1) }).use(i => println(s"Got `Int` $i")) // Got `Int` 3
You can also modify while summoning additional dependencies:
modify[Int]("named").by(_.flatAp { (adder: Adder, multiplier: Multiplier) => int: Int => multiplier.multiply(adder.add(int, 1), 10) })
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- implicit final lazy val mutationContext: MutationContext
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- final def tag(tags: BindingTag*): Unit
Add
tags
to all bindings in this module, except for included bindingsAdd
tags
to all bindings in this module, except for included bindings- Attributes
- protected[this]
- Definition Classes
- TagsDSL
- final def toString(): String
- Definition Classes
- ModuleBase → AnyRef → Any
- final def todo[T](implicit arg0: Tag[T], pos: CodePositionMaterializer): MakeDSLUnnamedAfterFrom[T]
Create a dummy binding that throws an exception with an error message when it's created.
Create a dummy binding that throws an exception with an error message when it's created.
Useful for prototyping.
- Attributes
- protected[this]
- Definition Classes
- AbstractBindingDefDSL
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()