/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . k oin . experimental . builder Ċ Ċ import Ġorg . k oin . core . parameter . Parameter Definition Ċ import Ġorg . k oin . core . parameter . empty Parameter Definition Ċ import Ġorg . k oin . core . scope . set Scope Ċ import Ġorg . k oin . dsl . context . Module Definition Ċ import Ġorg . k oin . dsl . definition . Bean Definition Ċ import Ġorg . k oin . dsl . definition . Kind Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠSingle Ġdefinition Ġfor Ġgiven Ġtype ĠT Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġcreate On Start Ġ- Ġneed Ġto Ġbe Ġcreated Ġat Ġstart Ċ Ġ* Ġ@ param Ġoverride Ġ- Ġallow Ġdefinition Ġoverride Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠModule Definition . single ( ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġcreate On Start : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse Ċ ): ĠBean Definition < T > Ġ{ ĊĠĠĠ Ġreturn Ġprovide ( name , Ġcreate On Start , Ġoverride , ĠKind . Single ) Ġ{ Ġcreate < T >() Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠFactory Ġdefinition Ġfor Ġgiven Ġtype ĠT Ċ Ġ* Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġoverride Ġ- Ġallow Ġdefinition Ġoverride Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠModule Definition . factory ( ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse Ċ ): ĠBean Definition < T > Ġ{ ĊĠĠĠ Ġreturn Ġprovide ( name , Ġfalse , Ġoverride , ĠKind . Factory ) Ġ{ Ġcreate < T >() Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠScope Ġdefinition Ġfor Ġgiven Ġtype ĠT Ċ Ġ* Ċ Ġ* Ġ@ param Ġscope Id Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġoverride Ġ- Ġallow Ġdefinition Ġoverride Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠModule Definition . scope ( ĊĠĠĠ Ġscope Id : ĠString , ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse Ċ ): ĠBean Definition < T > Ġ{ ĊĠĠĠ Ġval Ġbean Definition Ġ= Ġprovide ( name , Ġfalse , Ġoverride , ĠKind . Scope ) Ġ{ Ġcreate < T >() Ġ} ĊĠĠĠ Ġbean Definition . set Scope ( scope Id ) ĊĠĠĠ Ġreturn Ġbean Definition Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġinstance Ġfor Ġtype ĠT Ġand Ġinject Ġdependencies Ġinto Ġ 1 st Ġconstructor Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠModule Definition . create (): ĠT Ġ{ ĊĠĠĠ Ġval Ġclazz Ġ= ĠT :: class . java ĊĠĠĠ Ġval Ġctor Ġ= Ġclazz . construct ors . first OrNull () Ġ?: Ġerror (" No Ġconstructor Ġfound Ġfor Ġclass Ġ'$ clazz '") ĊĠĠĠ Ġval Ġargs Ġ= Ġctor . parameter Types . map Ġ{ Ġget For Class ( clazz Ġ= Ġit ) Ġ}. to Typed Array () ĊĠĠĠ Ġreturn Ġctor . newInstance (* args ) Ġas ĠT Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠSingle Ġdefinition Ġfor Ġgiven Ġtype ĠT Ġto Ġload Modules Ġand Ġcast Ġas ĠR Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġcreate On Start Ġ- Ġneed Ġto Ġbe Ġcreated Ġat Ġstart Ċ Ġ* Ġ@ param Ġoverride Ġ- Ġallow Ġdefinition Ġoverride Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny , Ġre ified ĠT Ġ: ĠR > ĠModule Definition . single By ( ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġcreate On Start : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse Ċ ): ĠBean Definition < R > Ġ{ ĊĠĠĠ Ġreturn Ġprovide ( name , Ġcreate On Start , Ġoverride , ĠKind . Single ) Ġ{ Ġcreate < T >() Ġas ĠR Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠFactory Ġdefinition Ġfor Ġgiven Ġtype ĠT Ġto Ġload Modules Ġand Ġcast Ġas ĠR Ċ Ġ* Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġoverride Ġ- Ġallow Ġdefinition Ġoverride Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny , Ġre ified ĠT Ġ: ĠR > ĠModule Definition . factory By ( ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse Ċ ): ĠBean Definition < R > Ġ{ ĊĠĠĠ Ġreturn Ġprovide ( name , Ġfalse , Ġoverride , ĠKind . Factory ) Ġ{ Ġcreate < T >() Ġas ĠR Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa ĠScope Ġdefinition Ġfor Ġgiven Ġtype ĠT , Ġapplied Ġto ĠR Ċ Ġ* Ċ Ġ* Ġ@ param Ġscope Id Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġoverride Ġ- Ġallow Ġdefinition Ġoverride Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny , Ġre ified ĠT Ġ: ĠR > ĠModule Definition . scope By ( ĊĠĠĠ Ġscope Id : ĠString , ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġoverride : ĠBoolean Ġ= Ġfalse Ċ ): ĠBean Definition < R > Ġ{ ĊĠĠĠ Ġval Ġbean Definition Ġ= Ġprovide ( name , Ġfalse , Ġoverride , ĠKind . Scope ) Ġ{ Ġcreate < T >() Ġas ĠR Ġ} ĊĠĠĠ Ġbean Definition . set Scope ( scope Id ) ĊĠĠĠ Ġreturn Ġbean Definition Ċ } Ċ Ċ /** Ċ Ġ* ĠResolve Ġa Ġcomponent Ġfrom Ġits Ġclass Ċ Ġ* Ċ Ġ* Ġ@ param Ġname Ċ Ġ* Ġ@ param Ġclazz Ġ- Ġjava Ġclass Ċ Ġ* Ġ@ param Ġparameters Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠModule Definition . get For Class ( ĊĠĠĠ Ġname : ĠString Ġ= Ġ"", ĊĠĠĠ Ġclazz : ĠClass < T >, ĊĠĠĠ Ġparameters : ĠParameter Definition Ġ= Ġempty Parameter Definition () Ċ ): ĠT Ġ= Ġk oin Context . get ( name , Ġclazz Ġ= Ġclazz . kotlin , Ġparameters Ġ= Ġparameters )