package Ġio . kot est . engine Ċ Ċ import Ġio . kot est . core . config . configuration Ċ import Ġio . kot est . core . extensions . Constructor Extension Ċ import Ġio . kot est . core . extensions . Post Instantiation Extension Ċ import Ġio . kot est . core . spec . Spec Ċ import Ġio . kot est . fp . Try Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ Ċ /** Ċ Ġ* ĠCreates Ġan Ġinstance Ġof Ġa Ġ[ Spec ] Ġby Ġdeleg ating Ġto Ġconstructor Ġextensions , Ġwith Ċ Ġ* Ġa Ġfallback Ġto Ġa Ġreflection Ġbased Ġzero - args Ġconstructor . Ċ Ġ* Ċ Ġ* ĠAfter Ġcreation Ġwill Ġexecute Ġany Ġpost Ġprocess Ġextensions . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠSpec > Ġcreate And Initialize Spec ( clazz : ĠK Class < T >): ĠTry < Spec > Ġ= ĊĠĠ ĠTry Ġ{ ĊĠĠĠĠĠ Ġval Ġinitial : ĠSpec ? Ġ= Ġnull ĊĠĠĠĠĠ Ġval Ġspec Ġ= Ġconfiguration . extensions (). filter Is Instance < Constructor Extension >() ĊĠĠĠĠĠĠĠĠ Ġ. fold ( initial ) Ġ{ Ġspec , Ġext Ġ-> Ġspec Ġ?: Ġext . instantiate ( clazz ) Ġ} Ġ?: Ġjava Reflect New Instance ( clazz ) ĊĠĠĠĠĠ Ġconfiguration . extensions (). filter Is Instance < Post Instantiation Extension >() ĊĠĠĠĠĠĠĠĠ Ġ. fold ( spec ) Ġ{ Ġacc , Ġext Ġ-> Ġext . process ( acc ) Ġ} ĊĠĠ Ġ} Ċ Ċ fun Ġ< T Ġ: ĠSpec > Ġjava Reflect New Instance ( clazz : ĠK Class < T >): ĠSpec Ġ{ ĊĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġclazz . construct ors . find Ġ{ Ġit . parameters . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠSpec Instantiation Exception (" Could Ġnot Ġcreate Ġinstance Ġof Ġ$ clazz . ĠSpec s Ġmust Ġhave Ġa Ġpublic Ġzero - arg Ġconstructor .", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠ Ġconstructor . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠ Ġreturn Ġconstructor . call () ĊĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠSpec Instantiation Exception (" Could Ġnot Ġcreate Ġinstance Ġof Ġ$ clazz ", Ġt ) ĊĠĠ Ġ} Ċ } Ċ Ċ class ĠSpec Instantiation Exception ( msg : ĠString , Ġt : ĠThrowable ?) Ġ: ĠRuntimeException ( msg , Ġt ) Ċ