package Ġcom . trend . lazy inject . kotlin support Ċ Ċ import Ġcom . trend . lazy inject . lib . component . Component Manager Ċ import Ġcom . trend . lazy inject . lib . di . DI Impl Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property Ċ import Ġkotlin . reflect . jvm . java Getter Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġg any ao Ġon Ġ 2 0 1 7 / 1 2 / 5 . Ċ Ġ*/ Ċ public Ġfun Ġ< T > Ġinject Component () Ġ: ĠReadOnly Property < Any , ĠT > Ġ= ĠComponent Provider < Any , T >(); Ċ Ċ public Ġfun Ġ< T > Ġinject ( component Ġ: ĠAny Ġ= ĠNone :: class , Ġalways Refresh : ĠBoolean Ġ= Ġfalse , Ġvar arg Ġargs : ĠAny ) Ġ: ĠReadOnly Property < Any , ĠT > Ġ= ĠElement Provider < Any , T >( component , Ġalways Refresh , Ġargs ); Ċ Ċ public Ġfun Ġ< T > Ġinject ( component Ġ: ĠAny Ġ= ĠNone :: class , Ġalways Refresh : ĠBoolean Ġ= Ġfalse ) Ġ: ĠReadOnly Property < Any , ĠT > Ġ= ĠElement Provider No Args < Any , T >( component , Ġalways Refresh ); Ċ Ċ private Ġclass ĠComponent Provider < R , T > Ġ: ĠReadOnly Property < R , T > Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠEMPTY ĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠAny ? Ġ= ĠEMPTY ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠR , Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠEMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠComponent Manager . getComponent ( property . java Getter ?. returnType ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠT ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġclass ĠElement Provider < R , T >( component : ĠAny Ġ= ĠNone :: class , Ġalways Refresh : ĠBoolean Ġ= Ġfalse , Ġvar arg Ġargs : ĠAny ) Ġ: ĠReadOnly Property < R , T > Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠEMPTY ĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠAny ? Ġ= ĠEMPTY ĊĠĠĠ Ġprivate Ġvar Ġcomponent Ġ: ĠAny Ġ= Ġcomponent ; ĊĠĠĠ Ġprivate Ġvar Ġargs Ġ: ĠAny Ġ= Ġargs ; ĊĠĠĠ Ġprivate Ġvar Ġalways Refresh : ĠBoolean Ġ= Ġalways Refresh ; ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠR , Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull Ġ|| Ġvalue Ġ== ĠEMPTY Ġ|| Ġalways Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Ġ== ĠNone :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Ġ= Ġproperty . java Getter ?. returnType ?. enc lo sing Class ?: None :: class ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Ġ== ĠNone :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠT ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Ġis ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠDI Impl . provider Value ( component Ġas ĠClass <* >, Ġproperty . java Getter ?. generic ReturnType , Ġargs ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( component Ġis ĠK Class <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠDI Impl . provider Value (( component Ġas ĠK Class < *> ). java , Ġproperty . java Getter ?. generic ReturnType , Ġargs ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠT ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġclass ĠElement Provider No Args < R , T >( component : ĠAny Ġ= ĠNone :: class , Ġalways Refresh : ĠBoolean Ġ= Ġfalse ) Ġ: ĠReadOnly Property < R , T > Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠEMPTY ĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠAny ? Ġ= ĠEMPTY ĊĠĠĠ Ġprivate Ġvar Ġcomponent Ġ: ĠAny Ġ= Ġcomponent ; ĊĠĠĠ Ġprivate Ġvar Ġalways Refresh : ĠBoolean Ġ= Ġalways Refresh ; ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠR , Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull Ġ|| Ġvalue Ġ== ĠEMPTY Ġ|| Ġalways Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Ġ== ĠNone :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Ġ= Ġproperty . java Getter ?. returnType ?. enc lo sing Class ?: None :: class ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Ġ== ĠNone :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠT ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Ġis ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠDI Impl . provider Value ( component Ġas ĠClass <* >, Ġproperty . java Getter ?. generic ReturnType , Ġnull ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( component Ġis ĠK Class <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠDI Impl . provider Value (( component Ġas ĠK Class < *> ). java , Ġproperty . java Getter ?. generic ReturnType , Ġnull ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠT ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠNone {}