package Ġnet . tw ister rob . challenges . ad vent Of Kotlin 2 0 1 8 . week 2 Ċ Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property Ċ Ċ class ĠT win ject Ġ{ ĊĊ ĉ inline Ġoperator Ġfun Ġinvoke ( block : ĠT win ject . () Ġ-> ĠUnit ): ĠT win ject Ġ= Ġthis . apply ( block ) ĊĊ ĉ private Ġval Ġlocator Ġ= Ġmutable Map Of < K Class <* >, Ġ() Ġ-> ĠAny >() ĊĊ ĉ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġregister ( no inline Ġprovider : Ġ() Ġ-> ĠT ) Ġ= Ġregister ( T :: class , Ġprovider ) ĊĊ ĉ fun Ġ< T Ġ: ĠAny > Ġregister ( type : ĠK Class < T >, Ġprovider : Ġ() Ġ-> ĠT ) Ġ{ Ċĉ ĉ locator [ type ] Ġ= Ġprovider Ċ ĉ } ĊĊ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ operator Ġfun Ġ< T Ġ: ĠAny > Ġget ( type : ĠK Class < T >): ĠT Ġ= Ċĉ ĉ locator . getValue ( type )() Ġas ĠT ĊĊ ĉ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġinject (): ĠT Ġ= Ġget ( T :: class ) ĊĊ ĉ inline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġinvoke (): ĠT Ġ= Ġinject () ĊĊ ĉ inline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠgetValue ( receiver : ĠAny , Ġproperty : ĠK Property < *> ): ĠT Ġ= Ġinject () Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġsingleton ( no inline Ġprovider : Ġ() Ġ-> ĠT ): Ġ() Ġ-> ĠT Ġ{ Ċ ĉ val Ġlazy Ġ= Ġlazy Ġ{ Ġprovider () Ġ} Ċ ĉ return Ġ{ Ġlazy . value Ġ} Ċ } Ċ