@ file : Suppress (" UN CHECK ED _ CAST ") Ċ Ċ package Ġro cks . le ight . core . container Ċ Ċ import Ġro cks . le ight . core . api . container . Factory Exception Ċ import Ġro cks . le ight . core . api . container . I Container Ċ import Ġro cks . le ight . core . api . container . I Factory Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . primary Constructor Ċ Ċ abstract Ġclass ĠAbstract Factory < U > Ġ: ĠI Factory < U > Ġ{ Ċ ĉ private Ġval Ġuuid : ĠUUID Ġ= ĠUUID . randomUUID () ĊĊ ĉ override Ġfun Ġget Uuid (): ĠUUID Ġ{ Ċĉ ĉ return Ġuuid Ċ ĉ } Ċ } Ċ Ċ open Ġclass ĠSingleton Factory < T Ġ: ĠAny >( private Ġval Ġimpl : ĠK Class < out ĠT >, Ġvar Ġinstance : ĠT ? Ġ= Ġnull ) Ġ: ĠAbstract Factory < T >() Ġ{ Ċ ĉ override Ġfun ĠgetName (): ĠString Ġ{ Ċĉ ĉ return Ġimpl . qualified Name Ġas ĠString Ċ ĉ } ĊĊ ĉ override Ġfun Ġget Reflection (): ĠArray < K Class <* >> Ġ{ Ċĉ ĉ if Ġ( impl . primary Constructor Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ throw ĠFactory Exception (" Cannot Ġget Ġprimary Ġconstructor Ġof Ġclass Ġ[ ${ impl . qualified Name } ]. ") Ċĉ ĉ } Ċĉ ĉ var Ġparams Ġ= ĠarrayOf < K Class <* >>() Ċĉ ĉ for Ġ( parameter Ġin Ġimpl . primary Constructor !!. parameters ) Ġ{ Ċĉĉ ĉ params Ġ+= Ġparameter . type . classifier Ġas ĠK Class < T > Ċĉ ĉ } Ċĉ ĉ return Ġparams Ċ ĉ } ĊĊ ĉ override Ġfun Ġcreate ( container : ĠI Container , Ġparams : ĠArray < *> ?): ĠT Ġ{ Ċĉ ĉ if Ġ( instance Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ if Ġ( impl . primary Constructor Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ throw ĠFactory Exception (" Cannot Ġget Ġprimary Ġconstructor Ġof Ġclass Ġ[ ${ impl . qualified Name } ]. ") Ċĉĉ ĉ } Ċĉĉ ĉ var Ġdependencies Ġ= Ġparams Ċĉĉ ĉ if Ġ( dependencies Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ dependencies Ġ= ĠarrayOf < Any >() Ċĉĉĉ ĉ for Ġ( clazz Ġin Ġthis . get Reflection ()) Ġ{ Ċĉĉĉĉ ĉ dependencies Ġ+= Ġcontainer . create ( clazz ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ instance Ġ= Ġimpl . primary Constructor !!. call (* dependencies ) Ċĉ ĉ } Ċĉ ĉ return Ġinstance Ġas ĠT Ċ ĉ } Ċ } Ċ Ċ class ĠInterface Factory < T Ġ: ĠAny , ĠU Ġ: ĠT >( private Ġval Ġiface : ĠK Class < T >, Ġimpl : ĠK Class < out ĠU >, Ġinstance : ĠU ? Ġ= Ġnull ) Ġ: Ċ ĉ Singleton Factory < U >( impl , Ġinstance ) Ġ{ Ċ ĉ override Ġfun ĠgetName (): ĠString Ġ{ Ċĉ ĉ return Ġiface . qualified Name Ġas ĠString Ċ ĉ } Ċ } Ċ Ċ class ĠContainer Callback Factory < T Ġ: ĠAny , ĠU Ġ: ĠT >( Ċ ĉ private Ġval Ġiface : ĠK Class < T >, Ċ ĉ private Ġval Ġcallback : ĠI Container . () Ġ-> ĠU , Ċ ĉ impl : ĠK Class < out ĠU >, Ċ ĉ instance : ĠU ? Ġ= Ġnull Ċ ) Ġ: ĠSingleton Factory < U >( impl , Ġinstance ) Ġ{ Ċ ĉ override Ġfun ĠgetName (): ĠString Ġ{ Ċĉ ĉ return Ġiface . qualified Name Ġas ĠString Ċ ĉ } ĊĊ ĉ override Ġfun Ġcreate ( container : ĠI Container , Ġparams : ĠArray < *> ?): ĠU Ġ{ Ċĉ ĉ if Ġ( instance Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ instance Ġ= Ġcallback . invoke ( container ) Ċĉ ĉ } Ċĉ ĉ return Ġinstance Ġas ĠU Ċ ĉ } Ċ } Ċ Ċ class ĠCallback Factory < T Ġ: ĠAny , ĠU Ġ: ĠT >( Ċ ĉ private Ġval Ġiface : ĠK Class < T >, Ċ ĉ private Ġval Ġcallback : Ġ() Ġ-> ĠU , Ċ ĉ impl : ĠK Class < out ĠU >, Ċ ĉ instance : ĠU ? Ġ= Ġnull Ċ ) Ġ: ĠSingleton Factory < U >( impl , Ġinstance ) Ġ{ Ċ ĉ override Ġfun ĠgetName (): ĠString Ġ{ Ċĉ ĉ return Ġiface . qualified Name Ġas ĠString Ċ ĉ } ĊĊ ĉ override Ġfun Ġcreate ( container : ĠI Container , Ġparams : ĠArray < *> ?): ĠU Ġ{ Ċĉ ĉ if Ġ( instance Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ instance Ġ= Ġcallback () Ċĉ ĉ } Ċĉ ĉ return Ġinstance Ġas ĠU Ċ ĉ } Ċ } Ċ