package Ġorg . me ch d ancer . dependency . annotated Ċ Ċ import Ġorg . me ch d ancer . dependency .* Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . full . declared Member Properties Ċ import Ġkotlin . reflect . jvm . java Field Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ /** Ċ Ġ* ĠAnnotation Ġstyle Ġdependency Ġmanager Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠAnnot ated Injector < T Ġ: ĠAny >( private Ġval Ġdependent : ĠT , Ġtype : ĠK Class < T >) Ġ: ĠScope EventHandler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdependencies Ġ= Ġmutable ListOf < Type Safe Dependency <* >>() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Fields Ġ= Ġtype . declared Member Properties ĊĊĠĠĠĠĠĠĠ Ġfun ĠK Property 1 < *, Ġ* >. getName () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Field !!. annotations . first NotNull Of OrNull Ġ{ Ġit Ġas ? ĠName Ġ} ?. name ĊĊĠĠĠĠĠĠĠ Ġfun ĠComponent . to Predicate ( name : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠI Named Component <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ== Ġthis . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtrue ĊĊĠĠĠĠĠĠĠ Ġall Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . java Field ?. is Annotation Present ( Must :: class . java ) Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . getName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneeds Un wrap Ġ= Ġit . java Field !!. is Annotation Present ( Un wrap :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Safe Dependency . Dependency ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( needs Un wrap ) ĠUnique Component Wrapper :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . returnType . jvm Er asure Ġas ĠK Class < out ĠComponent > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġcomponent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( needs Un wrap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn variance : ĠSee Ġthe Ġnote Ġon Ġ[ Unique Component Wrapper ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( component Ġis ĠUnique Component Wrapper < *> Ġ&& Ġit . returnType . jvm Er asure Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ) Ġ&& Ġcomponent . to Predicate ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġdep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep . setOn Set Listener Ġ{ Ġcomponent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . java Field !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( needs Un wrap Ġ&& Ġcomponent Ġis ĠUnique Component Wrapper <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( dependent , Ġcomponent . wrapped ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( dependent , Ġcomponent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġall Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . java Field ?. is Annotation Present ( Maybe :: class . java ) Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . returnType . is Marked Nullable Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . returnType . is Marked Nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ("$ it Ġwas Ġannotated Ġwith ĠMaybe , Ġbut Ġut Ġis Ġnot Ġa Ġnullable Ġproperty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . getName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneeds Un wrap Ġ= Ġit . java Field !!. is Annotation Present ( Un wrap :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Safe Dependency . Weak Dependency ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( needs Un wrap ) ĠUnique Component Wrapper :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . returnType . jvm Er asure Ġas ĠK Class < out ĠComponent > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġcomponent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( needs Un wrap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn variance : ĠSee Ġthe Ġnote Ġon Ġ[ Unique Component Wrapper ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Ġis ĠUnique Component Wrapper < *> Ġ&& Ġit . returnType . jvm Er asure Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ) Ġ&& Ġcomponent . to Predicate ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġdep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep . setOn Set Listener Ġ{ Ġcomponent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . java Field !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( needs Un wrap Ġ&& Ġcomponent Ġis ĠUnique Component Wrapper <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( dependent , Ġcomponent . wrapped ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( dependent , Ġcomponent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep . setOn Clear Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . java Field !!. set ( dependent , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdependencies . addAll ( it ) Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġhandle ( scope Event : ĠScope Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( scope Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScope Event . Dependency Ar rived Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . field OrNull () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set ( scope Event . dependency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScope Event . Dependency Left Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . field OrNull () Ġ== Ġscope Event . dependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Safe Dependency . Dependency Ġ-> Ġthrow ĠTe ardown Strict Dependency Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Event . dependency , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Safe Dependency . Weak Dependency Ġ-> Ġit . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ