package Ġcom . j tran sc . injector Ċ Ċ import Ġcom . j tran sc . annotation . J Tran sc Keep Ċ import Ġcom . j tran sc . annotation . J Tran sc Keep Construct ors Ċ import Ġcom . j tran sc . error . invalid Op Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠInject or () Ġ{ Ċ ĉ val Ġmaps Ġ= Ġhash Map Of < Class <* >, Ġ() Ġ-> ĠAny >( Ċĉ ĉ Injector :: class . java Ġto Ġ{ Ġthis @ Injector Ġ} Ċ ĉ ) ĊĊ ĉ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġget (): ĠT Ġ= ĠgetInstance ( T :: class . java ) Ċ ĉ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġget OrNull (): ĠT ? Ġ= ĠgetInstance OrNull ( T :: class . java ) Ċ ĉ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġget ( default : Ġ() Ġ-> ĠT ): ĠT Ġ= Ġif Ġ( T :: class . java Ġin Ġmaps ) ĠgetInstance ( T :: class . java ) Ġelse Ġdefault () ĊĊ ĉ fun Ġ< T Ġ: ĠAny > ĠgetInstance ( clazz : ĠClass < T >): ĠT Ġ{ Ċĉ ĉ return ĠgetInstance OrNull ( clazz ) Ċĉĉ ĉ ?: Ġinvalid Op (" Cannot Ġautom ap Ġ'$ clazz ' Ġnot Ġ@ Singleton Ġor Ġ@ Prototype ") Ċ ĉ } ĊĊ ĉ fun Ġ< T Ġ: ĠAny > ĠgetInstance OrNull ( clazz : ĠClass < T >): ĠT ? Ġ{ Ċĉ ĉ if Ġ( clazz Ġ! in Ġmaps ) Ġ{ Ċĉĉ ĉ val Ġall Annotations Ġ= ĠgetAll Annotations ( clazz ) Ċĉĉ ĉ val Ġis Singleton Ġ= Ġall Annotations . filter Is Instance < Singleton ?> (). isNotEmpty () Ċĉĉ ĉ val Ġis Prototype Ġ= Ġall Annotations . filter Is Instance < Prototype ?> (). isNotEmpty () Ċĉĉ ĉ if Ġ(! is Singleton Ġ&& Ġ! is Prototype ) Ġ{ Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ map Implementation ( clazz , Ġclazz ) Ċĉ ĉ } Ċĉ ĉ return Ġthis . maps [ clazz ] !! () Ġas ĠT Ċ ĉ } ĊĊ ĉ internal Ġfun Ġ< T Ġ: ĠAny > Ġcreate Instance ( clazz : ĠClass < T >): ĠT Ġ{ Ċĉ ĉ val Ġc Ġ= Ġclazz . construct ors . first OrNull () Ġ?: Ġinvalid Op (" No Ġconstructors Ġfor Ġ$ clazz ") Ċĉ ĉ try Ġ{ Ċĉĉ ĉ return Ġc . newInstance (*( c . parameter Types . map Ġ{ Ġthis . getInstance ( it ) Ġ}). to Typed Array ()) Ġas ĠT Ċĉ ĉ } Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ Ċĉĉ ĉ throw ĠInvocation TargetException ( e , Ġ" Can 't Ġconstruct Ġclass Ġ$ clazz Ġ: Ġ$ c ") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun ĠgetAll Annotations ( clazz : ĠClass < *> ): ĠList < Annotation > Ġ{ Ċĉ ĉ return Ġif Ġ( clazz . super class Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ clazz . annotations . toList () Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ clazz . annotations . toList () Ġ+ ĠgetAll Annotations ( clazz . super class ) Ċĉ ĉ } Ġ+ Ġclazz . interfaces . flatMap Ġ{ ĠgetAll Annotations ( it ) Ġ} Ċ ĉ } ĊĊ ĉ fun Ġmap Implementation ( class Interface : ĠClass <* >, Ġclass Impl : ĠClass <* >) Ġ{ Ċĉ ĉ val Ġall Annotations Ġ= ĠgetAll Annotations ( class Impl ) Ċĉ ĉ val Ġis Singleton Ġ= Ġall Annotations . filter Is Instance < Singleton ?> (). isNotEmpty () Ċĉ ĉ var Ġcached : ĠAny ? Ġ= Ġnull ĊĊĉ ĉ this . maps [ class Interface ] Ġ= Ġ{ Ċĉĉ ĉ if Ġ( is Singleton ) Ġ{ Ċĉĉĉ ĉ if Ġ( cached Ġ== Ġnull ) Ġcached Ġ= Ġcreate Instance ( class Impl ) Ċĉĉĉ ĉ cached !! Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ create Instance ( class Impl ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġmap Instances ( var arg Ġobjs : ĠAny ) Ġ= Ġrun Ġ{ Ġfor Ġ( obj Ġin Ġobjs ) Ġmap Instance ( obj ) Ġ} Ċ ĉ fun Ġ< T Ġ: ĠAny > Ġmap Instance ( obj : ĠT ): ĠT Ġ= Ġmap Instance ( obj , Ġobj . java Class ) Ċ ĉ fun Ġ< T Ġ: ĠAny > Ġmap Instance ( obj : ĠT , Ġtype : ĠClass < T >): ĠT Ġ= Ġobj . apply Ġ{ Ġmaps [ type ] Ġ= Ġ{ Ġobj Ġ} Ġ} Ċ ĉ inline Ġfun Ġ< re ified ĠT Int Ġ: ĠAny , Ġre ified ĠT Impl Ġ: ĠT Int > Ġmap Impl () Ġ= Ġmap Implementation ( T Int :: class . java , ĠT Impl :: class . java ) Ċ } Ċ Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ @ Target ( Annotation Target . CLASS ) Ċ @ J Tran sc Keep Construct ors Ċ annotation Ġclass ĠSingleton () Ċ Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ @ Target ( Annotation Target . CLASS ) Ċ @ J Tran sc Keep Construct ors Ċ annotation Ġclass ĠProt otype ()