package Ġorg . inf user Ċ Ċ import Ġkotlin . reflect . K Property Ċ Ċ class ĠComponent Id < T >( private Ġval Ġcustom Name : ĠString ?, Ġval Ġjava Class : ĠClass < T >, Ġval Ġis Optional : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcustom Name Ġ?: Ġjava Class . canonical Name ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġ< re ified ĠT > Ġinvoke ( name : ĠString ? Ġ= Ġnull ): ĠComponent Id < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Optional Ġ= Ġnull Ġis ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComponent Id ( name , ĠT :: class . java , Ġis Optional ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Optional Sign Ġ= Ġif Ġ( is Optional ) Ġ" ?" Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( custom Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ java Class . simple Name }$ is Optional Sign ($ custom Name )" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDelegate < T >( private Ġval Ġcustom Name : ĠString ?, Ġprivate Ġval Ġitem Class : ĠClass < T >, Ġprivate Ġval Ġis Optional : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNOT _ INITIAL IZED Ġ= ĠAny () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠAny ? Ġ= ĠNOT _ INITIAL IZED ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget ( name : ĠString ): ĠComponent Id < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ=== ĠNOT _ INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ=== ĠNOT _ INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠComponent Id < T >( custom Name Ġ?: Ġname , Ġitem Class , Ġis Optional ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġas ĠComponent Id < T > ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠComponent Id < T > Ġ= Ġget ( property . name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > Ġcomponent Id ( custom Name : ĠString ? Ġ= Ġnull ): ĠComponent Id . Delegate < T > Ġ= ĠComponent Id . Delegate ( custom Name , ĠT :: class . java , Ġnull Ġis ĠT )