package Ġcom . az h ark ova . di . resolver Ċ Ċ import Ġcom . az h ark ova . di . scope . Main Scope Holder Ċ import Ġcom . az h ark ova . di . scope . Scope Protocol Ċ import Ġcom . az h ark ova . di . scope . Scope Type Ċ import Ġcom . az h ark ova . di . util . try Synchron ized Ċ import Ġkotlin . reflect . K Class Ċ Ċ interface ĠResolver Protocol Ġ{ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġregister ( clazz : ĠK Class < T >, Ġscope : ĠScope Type Ġ= ĠScope Type . Graph , Ġfabric : Ġ() Ġ-> ĠT ?) ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġresolve ( clazz : ĠK Class < T >): ĠT ? Ċ } Ċ Ċ public Ġclass ĠResolver Ġ: ĠResolver Protocol Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġdefault Scope : ĠScope Type Ġ= ĠScope Type . Graph ĊĠĠĠ Ġprivate Ġvar Ġregist rations : ĠHashMap < Int , ĠRegistration Ref <* >> Ġ= Ġhash Map Of () ĊĠĠĠ Ġprivate Ġ Ġval Ġscope Holder Ġ= ĠMain Scope Holder () ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġregister ( clazz : ĠK Class < T >, Ġscope : ĠScope Type , Ġfabric : Ġ() Ġ-> ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add ( clazz Ġ= Ġclazz , Ġscope Ġ= Ġscope , Ġfabric Ġ= Ġfabric ) ĊĠĠĠ Ġ} ĊĊĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġresolve ( clazz : ĠK Class < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġthis . search Reference ( clazz ) ĊĠĠĠĠĠĠĠ Ġif Ġ( reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Type Ġ= Ġreference . scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġselect Scope ( scope Type ). resolve ( reference , Ġ Ġclazz ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġadd ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠK Class < T >, ĊĠĠĠĠĠĠĠ Ġscope : ĠScope Type Ġ= ĠScope Type . Graph , ĊĠĠĠĠĠĠĠ Ġfabric : Ġ() Ġ-> ĠT ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Synchron ized ( regist rations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= ĠRegistration Ref ( clazz . qualified Name Ġ?: Ġ" NON AME ", Ġfabric ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference . scope Ġ= Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġclazz . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( regist rations . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregist rations [ key ] Ġ= Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregist rations . put ( key , Ġreference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Scope ( scope : ĠScope Type ): ĠScope Protocol Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScope Type . Cached Ġ-> Ġreturn Ġscope Holder . cached Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScope Type . Container Ġ-> Ġreturn Ġscope Holder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. container Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScope Type . Weak Ġ-> Ġreturn Ġscope Holder . weak Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScope Type . Entity Ġ-> Ġreturn Ġscope Holder . entity Scope ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScope Type . Graph Ġ-> Ġreturn Ġscope Holder . graph Scope ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġsearch Reference ( clazz : ĠK Class < T >): ĠRegistration Ref < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġclazz . qualified Name ĊĠĠĠĠĠĠĠ Ġtry Synchron ized ( regist rations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( regist rations . values . filter Ġ{ Ġit . name Ġ== Ġname Ġ}). first OrNull () Ġas ĠRegistration Ref < T >? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }