package Ġio . j ent z . w inter Ċ Ċ /** Ċ Ġ* ĠThe ĠComponent Ġstores Ġthe Ġdependency Ġproviders Ġwhich Ġare Ġthan Ġretrieved Ġand Ġinstantiated Ġby Ġan Ċ Ġ* Ġinstance Ġof Ġa Ġ[ graph ][ Graph ]. Ċ Ġ* Ċ Ġ* ĠInstances Ġare Ġbuild Ġby Ġcalling Ġ[ component ] Ġwith Ġa Ġ[ builder ][ Component Builder ] Ġblock . Ċ Ġ* Ċ Ġ* ĠComponents Ġare Ġimmutable Ġbut Ġan Ġextended Ġvariant Ġcan Ġbe Ġcreated Ġby Ġcalling Ġ[ derive ] Ġwith Ġa Ċ Ġ* Ġbuilder Ġblock . Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġval Ġapp Component Ġ= Ġcomponent Ġ{ Ċ Ġ* ĠĠĠĠ Ġprovider < My Service >( scope Ġ= Ġsingleton ) Ġ{ ĠMy ServiceImpl ( instance ()) Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġval Ġderived Ġ= Ġapp Component . derive Ġ{ Ċ Ġ* ĠĠĠĠ Ġprovider < My Other Service > Ġ{ ĠMy Other ServiceImpl ( instance (), Ġinstance (" named ")) Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġval Ġgraph Ġ= Ġderived . init Ġ{ Ġconstant < Application >( my Android Application ) Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠComponent Ġinternal Ġconstructor ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcomponents Ġqualifier Ġ( null Ġfor Ġroot Ġcomponents Ġand Ġthe Ġsub - components Ġqualifier Ġfor ĊĠĠĠĠ Ġ* Ġsub - components ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġqualifier : ĠAny ?, ĊĠĠĠ Ġprivate Ġval Ġdependencies : ĠMap < Type Key , ĠUn bound Service < *, Ġ* >> Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġan Ġextended Ġcopy Ġof Ġthis Ġcomponent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier Ġ( default : Ġ[ qual ifier ]). ĊĠĠĠĠ Ġ* Ġ@ param Ġblock ĠA Ġbuilder Ġblock Ġthat Ġis Ġcalled Ġin Ġthe Ġcontext Ġof Ġa Ġ[ Component Builder ]. ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġnew Ġ[ Component ] Ġthat Ġcontains Ġall Ġprovider Ġof Ġthe Ġbase Ġcomponent Ġplus Ġthe Ġone ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġdefined Ġin Ġthe Ġbuilder Ġblock . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġderive ( ĊĠĠĠĠĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġthis . qual ifier , ĊĠĠĠĠĠĠĠ Ġblock : ĠComponent Builder Block ĊĠĠĠ Ġ) Ġ= Ġcomponent ( qual ifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinclude ( this @ Component ) ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġsub component Ġby Ġits Ġqualifier Ġor Ġa Ġnested Ġsub component Ġby Ġits Ġpath Ġof Ġqual ifiers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMain Ġusage Ġfor Ġthis Ġis Ġto Ġre structure Ġcomponents Ġwhen Ġusing Ġ[ Component Builder . include ] ĊĠĠĠĠ Ġ* Ġin Ġconjunction Ġwith Ġ[ Component Builder . Sub component Include Mode . DoNot Include ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġqual ifiers ĠThe Ġqualifier / path Ġof Ġqual ifiers Ġof Ġthe Ġsub component ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġsub component ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠEntry NotFoundException ĠIf Ġthe Ġcomponent Ġdoes Ġnot Ġexist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsub component ( var arg Ġqual ifiers : ĠAny ): ĠComponent Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcomponent : ĠComponent Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġqual ifiers . forEach Ġ{ Ġqualifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġtype Key < Component >( qual ifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstant Ġ= Ġcomponent . dependencies [ key ] Ġas ? ĠConstant Service < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constant Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġqual ifiers . join ToString (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEntry NotFoundException ( key , Ġ" Sub component Ġwith Ġpath Ġ[$ path ] Ġdoesn 't Ġexist .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Ġ= Ġconstant . value Ġas ĠComponent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcomponent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġ[ dependency Ġgraph ][ Graph ] Ġfrom Ġthis Ġcomponent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġapplication ĠThe Ġ[ W inter Application ] Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ param Ġblock ĠAn Ġoptional Ġbuilder Ġblock Ġto Ġextend Ġthe Ġcomponent Ġbefore Ġcreating Ġthe Ġgraph . ĊĠĠĠĠ Ġ* Ġ@ return ĠAn Ġinstance Ġof Ġ[ Graph ] Ġbacked Ġby Ġthis Ġcomponent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġinit ( ĊĠĠĠĠĠĠĠ Ġapplication : ĠW inter Application Ġ= ĠW inter , ĊĠĠĠĠĠĠĠ Ġblock : ĠComponent Builder Block ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠGraph Ġ= ĠGraph ( null , Ġthis , Ġapplication , Ġblock ) ĊĊĠĠĠ Ġinternal Ġinline Ġfun ĠforEach ( block : Ġ( Map . Entry < Type Key , ĠUn bound Service < *, Ġ* >>) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdependencies . forEach ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġkeys (): ĠSet < Type Key > Ġ= Ġdependencies . keys ĊĊĠĠĠ Ġinternal Ġoperator Ġfun Ġget ( key : ĠType Key ): ĠUn bound Service < *, Ġ* >? Ġ= Ġdependencies [ key ] ĊĊĠĠĠ Ġinternal Ġval Ġsize : ĠInt Ġget () Ġ= Ġdependencies . size ĊĊĠĠĠ Ġinternal Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġdependencies . isEmpty () ĊĊĠĠĠ Ġinternal Ġfun Ġcontains Key ( type Key : ĠType Key ): ĠBoolean Ġ= Ġdependencies . containsKey ( type Key ) Ċ Ċ } Ċ