package Ġby . vk atz . le vi athan Ċ Ċ import Ġby . vk atz . le vi athan . Le vi athan . Service Delegate Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ // todo Ġscoped Ġinstance Ċ Ċ /** Ċ Ġ* ĠService Ġlocator Ġbase Ġclass Ċ Ġ* Ċ Ġ* ĠUsage : Ċ Ġ* Ċ Ġ* Ġ 1 ) Ġextend Ġclass Ġfrom ĠLe vi athan Ċ Ġ* Ġ 2 ) Ġcreate Ġservices Ġdeleg ates Ġby Ġusing Ġone Ġof Ġthe Ġprovided Ġhelpers Ċ Ġ* Ġ 3 ) Ġuse Ġdeleg ates Ġwithin Ġ' by ' Ġor Ġ'. invoke () Ġ/ Ġ() ' Ġin Ġcase Ġdeleg ated Ġservice Ċ Ġ* Ġ 4 ) Ġuse Ġ'=' Ġin Ġcase Ġdirect Ġservice Ċ Ġ* Ċ Ġ* ĠDeleg ated Ġservices Ġallow Ġyou Ġto Ġoverride Ġpro vid able Ċ Ġ* Ġcontent Ġvia Ġ[ Service Delegate . provides ] Ċ Ġ* Ċ Ġ* ĠExample : Ċ Ġ* Ġ``` Ċ Ġ* Ġclass ĠService (){ Ċ Ġ* ĠĠĠĠĠ Ġfun Ġdo Sm th (){ Ġ... Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ----- deleg ated Ġservice ----- Ċ Ġ* Ċ Ġ* Ġobject ĠService Locator : ĠLe vi athan () Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġval Ġservice Ġ= Ġinstance Ġ{ ĠService () Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġclass ĠModel 1 ( val Ġsl : ĠService Locator Ġ= ĠService Locator ){ Ċ Ġ* ĠĠĠĠĠ Ġval Ġservice Ġby Ġsl . service Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġfun Ġfoo (){ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġservice . do Sm th () Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġsl . service (). do Sm th () Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġclass ĠModel 2 ( val Ġservice : ĠService Ġ= ĠService Locator . service ()){ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġfun Ġfoo (){ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġservice . do Sm th () Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġ// override Ġexample Ċ Ġ* Ġfun Ġfoo (){ Ċ Ġ* ĠĠĠĠĠ Ġval Ġanother Service Ġ= ĠService () Ċ Ġ* ĠĠĠĠĠ ĠService Locator . service . provides ( another Service ) Ċ Ġ* ĠĠĠĠĠ Ġ// Service Locator . service Ġ=== Ġanother Service Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* ĠĠ Ġ----- direct Ġservice ---- Ċ Ġ* Ċ Ġ* Ġobject ĠService Locator : ĠLe vi athan () Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġval Ġservice Ġby Ġinstance Ġ{ ĠService () Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġclass ĠModel 1 ( val Ġsl : ĠService Locator Ġ= ĠService Locator ){ Ċ Ġ* ĠĠĠĠĠ Ġval Ġservice Ġ= Ġsl . service Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġfun Ġfoo (){ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġservice . do Sm th () Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġsl . service . do Sm th () Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġclass ĠModel 2 ( val Ġservice : ĠService Ġ= ĠService Locator . service ){ Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġfun Ġfoo (){ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġservice . do Sm th () Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ abstract Ġclass ĠLe vi athan Ġ{ ĊĠĠĠ Ġcompanion Ġobject ; ĊĊĠĠĠ Ġ// ----- ĠPro viders Ġ----- ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġdelegate Ġto Ġprovide Ġsame Ġservices Ġper Ġrequest ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠService Ġwill Ġbe Ġcreated Ġl az ily ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcreator Ġfactory Ġmethod Ġto Ġcreate Ġservice Ġobjects ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġ< T > Ġinstance ( lazy : ĠBoolean Ġ= Ġtrue , Ġcreator : Ġ() Ġ-> ĠT ): ĠService Delegate < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( lazy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLazy Service Delegate ( creator ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġcreator () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro vid able Service Delegate Ġ{ Ġservice Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġdelegate Ġto Ġprovide Ġnew Ġservice Ġper Ġeach Ġrequest ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcreator Ġfactory Ġmethod Ġto Ġcreate Ġservice ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġ< T > Ġfactory ( creator : Ġ() Ġ-> ĠT ): ĠService Delegate < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPro vid able Service Delegate Ġ{ Ġcreator () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ----- ĠHelpers Ġ----- ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠService Ġdelegate Ġobject , Ġprovides Ġappropriate Ġservice Ġby Ġcalling Ġ[ invoke ] Ġin Ġthe Ġfunction Ġbody ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġfun Ġfoo (){ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġservice Ġ= Ġdelegate () ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġor Ġdelegate Ġusage Ġvia Ġ" by " Ġconstruction ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġclass ĠFoo { ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġval Ġservice Ġby Ġdelegate ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAllow Ġto Ġoverride Ġpro vid able Ġobject Ġvia Ġ[ provides ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠService Delegate < T > Ġ: ĠReadOnly Property < Any ?, ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠForce Ġthe Ġdelegate Ġto Ġprovide Ġspecific Ġobject ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġto Ġ` null ` Ġto Ġprovide Ġoriginal Ġobject ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġprovides ( t : ĠT ?) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġthe Ġdeleg ated Ġservice Ġinstance ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke (): ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImp l Ġof Ġdelegate Ġ& Ġoverride Ġmethods ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠAbs Service Delegate < T > Ġ: ĠService Delegate < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġvar Ġpro vid able : ĠT ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprovides ( t : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro vid able Ġ= Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ= Ġinvoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLazy Ġservice Ġimplementation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġprovider Ġonce Ġto Ġinit Ġlazy Ġproperty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠLazy Service Delegate < T >( provider : Ġ() Ġ-> ĠT ) Ġ: ĠAbs Service Delegate < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġservice Ġby Ġlazy ( provider ) ĊĠĠĠĠĠĠĠ Ġoverride Ġoperator Ġfun Ġinvoke () Ġ= Ġpro vid able Ġ?: Ġservice ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimple Ġservice Ġdelegate ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġprovider Ġfor Ġall Ġcalls ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠPro vid able Service Delegate < T >( val Ġprovider : Ġ() Ġ-> ĠT ) Ġ: ĠAbs Service Delegate < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġoperator Ġfun Ġinvoke () Ġ= Ġpro vid able Ġ?: Ġprovider () ĊĠĠĠ Ġ} Ċ }