package Ġnet . app tr onic . core . context . di Ċ Ċ import Ġnet . app tr onic . core . context . Context Ċ import Ġnet . app tr onic . core . context . child Context Ċ import Ġnet . app tr onic . core . context . terminate Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠContext Ġof Ġcreating Ġmethods Ġin Ġmodule Ġdefinition Ċ Ġ*/ Ċ abstract Ġclass ĠScope Ġinternal Ġconstructor ( ĊĠĠĠ Ġprotected Ġval Ġdefinition Context : ĠContext , ĊĠĠĠ Ġprotected Ġval Ġdependency Dispatcher : ĠDependency Dispatcher , ĊĠĠĠ Ġprotected Ġval Ġparameters : ĠParameters Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġre cycl ers Ġ= Ġmutable ListOf < Recycler Method <* >>() ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠObjectType Ġ: ĠAny > Ġinject (): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ObjectType :: class Ġ== ĠContext :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Cannot Ġinject Ġ[ Context ]. ĠPlease Ġuse Ġdefinition Context () Ġor Ġprovided Context () Ġinstead ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinject ( ObjectType :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠObjectType Ġ: ĠAny > Ġoptional (): ĠObjectType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ObjectType :: class Ġ== ĠContext :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Cannot Ġinject Ġ[ Context ]. ĠPlease Ġuse Ġdefinition Context () Ġor Ġprovided Context () Ġinstead ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoptional ( ObjectType :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< ObjectType Ġ: ĠAny > Ġinject ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠK Class < ObjectType > ĊĠĠĠ Ġ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( clazz Ġ== ĠContext :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Cannot Ġinject Ġ[ Context ]. ĠPlease Ġuse Ġdefinition Context () Ġor Ġprovided Context () Ġinstead ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Injection ( object Key ( clazz )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< ObjectType Ġ: ĠAny > Ġoptional ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠK Class < ObjectType > ĊĠĠĠ Ġ): ĠObjectType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( clazz Ġ== ĠContext :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Cannot Ġinject Ġ[ Context ]. ĠPlease Ġuse Ġdefinition Context () Ġor Ġprovided Context () Ġinstead ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoptional Injection ( object Key ( clazz )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< ObjectType Ġ: ĠAny > Ġinject ( ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠDependency Descriptor < ObjectType > ĊĠĠĠ Ġ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Injection ( object Key ( descriptor )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< ObjectType Ġ: ĠAny > Ġoptional ( ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠDependency Descriptor < ObjectType > ĊĠĠĠ Ġ): ĠObjectType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoptional Injection ( object Key ( descriptor )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< ObjectType > Ġperform Injection ( ĊĠĠĠĠĠĠĠ Ġobject Key : ĠObject Key ĊĠĠĠ Ġ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparameters . get ( object Key ) Ġ?: Ġdependency Dispatcher . inject ( object Key , Ġempty Parameters ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< ObjectType > Ġoptional Injection ( ĊĠĠĠĠĠĠĠ Ġobject Key : ĠObject Key ĊĠĠĠ Ġ): ĠObjectType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparameters . get ( object Key ) Ġ?: Ġdependency Dispatcher . optional ( object Key , Ġempty Parameters ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġval Ġdefault Builder Context : ĠScoped Context Parent Definition ĊĊĠĠĠ Ġprivate Ġval Ġcontexts Ġ= Ġmutable ListOf < Context >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġnew Ġinstance Ġof Ġ[ Context ] Ġwhich Ġis Ġbound Ġto Ġthis Ġscope Ġand Ġwill Ġbe Ġautomatically Ġcancelled Ġwhen ĊĠĠĠĠ Ġ* Ġthis Ġscope Ġends . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġscoped Context ( ĊĠĠĠĠĠĠĠ Ġparent : ĠScoped Context Parent Definition Ġ= Ġdefault Builder Context , ĊĠĠĠĠĠĠĠ Ġbuilder : ĠContext . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscoped Context Ġ= Ġparent . context . child Context ( builder ) ĊĠĠĠĠĠĠĠ Ġcontexts . add ( scoped Context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġscoped Context ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġauto Re cycle ( is Auto Re cycle : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Auto Re cycle Ġis ĠAuto Re cycl ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Auto Re cycle . on Re cycle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Auto Re cycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠT . on Re cycle ( recycler : Ġ( T ) Ġ-> ĠUnit ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġre cycl ers . add ( Recycler Method ( this , Ġre cycler )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġfinalize () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cycl ers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute Re cycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontexts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . terminate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdefinition : ĠScoped Context Parent Definition Ġ= ĠScoped Context Parent Definition ( definition Context ) Ċ Ċ } Ċ Ċ class ĠSingle Scope Ġinternal Ġconstructor ( ĊĠĠĠ Ġdefinition Context : ĠContext , ĊĠĠĠ Ġdependency Dispatcher : ĠDependency Dispatcher Ċ ) Ġ: ĠScope ( definition Context , Ġdependency Dispatcher , Ġempty Parameters ()) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġdefault Builder Context Ġ= ĠScoped Context Parent Definition ( definition Context ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInject Ġcontext Ġin Ġwhich Ġthis Ġprovider Ġis Ġdefined . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdefinition Context (): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdefinition Context ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ abstract Ġclass ĠParameters Scope ( ĊĠĠĠ Ġdefinition Context : ĠContext , ĊĠĠĠ Ġdependency Dispatcher : ĠDependency Dispatcher , ĊĠĠĠ Ġparameters : ĠParameters Ċ ) Ġ: ĠScope ( definition Context , Ġdependency Dispatcher , Ġparameters ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġinjection Ġfrom Ġinjection Ġcontext . ĠAllows Ġto Ġoverride Ġinstances Ġin Ġchild Ġcontext Ġor Ġparameters ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠObjectType Ġ: ĠAny > Ġprovided (): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprovided ( ObjectType :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġinjection Ġfrom Ġinjection Ġcontext . ĠAllows Ġto Ġoverride Ġinstances Ġin Ġchild Ġcontext Ġor Ġparameters ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< ObjectType Ġ: ĠAny > Ġprovided ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠK Class < ObjectType > ĊĠĠĠ Ġ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( clazz Ġ== ĠContext :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ ĠIllegalArgumentException (" Cannot Ġinject Ġ[ Context ]. ĠPlease Ġuse Ġdefinition Context () Ġor Ġprovided Context () Ġinstead ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Provide ( object Key ( clazz )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġinjection Ġfrom Ġinjection Ġcontext . ĠAllows Ġto Ġoverride Ġdescriptors Ġin Ġchild Ġcontext Ġor Ġparameters ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< ObjectType Ġ: ĠAny > Ġprovided ( ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠDependency Descriptor < ObjectType > ĊĠĠĠ Ġ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Provide ( object Key ( descriptor )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġ< ObjectType > Ġperform Provide ( ĊĠĠĠĠĠĠĠ Ġobject Key : ĠObject Key ĊĠĠĠ Ġ): ĠObjectType Ċ Ċ } Ċ Ċ class ĠFactory Scope Ġinternal Ġconstructor ( ĊĠĠĠ Ġdefinition Context : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġinjection Context : ĠContext , ĊĠĠĠ Ġdependency Dispatcher : ĠDependency Dispatcher , ĊĠĠĠ Ġparameters : ĠParameters Ċ ) Ġ: ĠParameters Scope ( definition Context , Ġdependency Dispatcher , Ġparameters ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġinjection Dispatcher Ġ= Ġinjection Context . dependency Dispatcher ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInject Ġcontext Ġin Ġwhich Ġinjection Ġperformed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprovided Context (): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinjection Context ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< ObjectType > Ġperform Provide ( object Key : ĠObject Key ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparameters . get ( object Key ) Ġ?: Ġinjection Dispatcher . inject ( object Key , Ġempty Parameters ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdefault Builder Context Ġ= ĠScoped Context Parent Definition ( injection Context ) ĊĊĠĠĠ Ġval Ġprovided : ĠScoped Context Parent Definition Ġ= ĠScoped Context Parent Definition ( definition Context ) Ċ Ċ } Ċ Ċ class ĠShared Scope Ġinternal Ġconstructor ( ĊĠĠĠ Ġdefinition Context : ĠContext , ĊĠĠĠ Ġdependency Dispatcher : ĠDependency Dispatcher , ĊĠĠĠ Ġparameters : ĠParameters Ċ ) Ġ: ĠParameters Scope ( definition Context , Ġdependency Dispatcher , Ġparameters ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< ObjectType > Ġperform Provide ( object Key : ĠObject Key ): ĠObjectType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparameters . get ( object Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInjection FailedException (" Cannot Ġprovide Ġ$ object Key : Ġthis Ġis Ġmissing Ġin Ġprovided Ġparameters ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdefault Builder Context Ġ= ĠScoped Context Parent Definition ( definition Context ) Ċ Ċ }