package Ġcom . in ari . fire fly . core . component Ċ Ċ import Ġcom . in ari . fire fly . core . Component Ref Predicate Ċ import Ġcom . in ari . fire fly . core . Component Ref Resolver Ċ import Ġcom . in ari . util . Named Ċ import Ġcom . in ari . util . aspect . Aspect Ċ import Ġcom . in ari . util . indexed . Indexed Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Dsl Marker Ċ annotation Ġclass ĠComponent DSL Ċ Ċ @ Component DSL Ċ interface ĠComponent Ġ: ĠIndexed Ġ{ ĊĠĠĠ Ġval Ġcomponent Id : ĠComp Id ĊĠĠĠ Ġfun Ġdispose () Ċ } Ċ Ċ interface ĠNamed Component Ġ: ĠComponent , ĠNamed Ċ Ċ interface ĠComponent Type < C Ġ: ĠComponent > Ġ: ĠAs pect Ġ{ ĊĠĠĠ Ġval Ġtype Class : ĠK Class < C > ĊĠĠĠ Ġval Ġsub Type Class : ĠK Class < out ĠC > Ċ } Ċ Ċ class ĠComp Id Ġ( ĊĠĠĠ Ġval Ġinstance Id : ĠInt , ĊĠĠĠ Ġval Ġcomponent Type : ĠComponent Type < *> Ċ ) Ġ: ĠIndexed Ġ{ ĊĊĠĠĠ Ġfun Ġcheck Type ( type Aspect : ĠAs pect ): ĠComp Id Ġ{ ĊĠĠĠĠĠĠĠ Ġcomponent Type . aspect Type . type Check ( type Aspect ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġindex : ĠInt Ġ= Ġinstance Id ĊĠĠĠ Ġoverride Ġval Ġindexed TypeName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcomponent Type . aspect Name ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġthis :: class Ġ!= Ġother :: class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠComp Id ĊĊĠĠĠĠĠĠĠ Ġif Ġ( instanceId Ġ!= Ġother . instanceId ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( component Type Ġ!= Ġother . component Type ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġinstance Id ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcomponent Type . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Comp Id ( instanceId =$ instanceId , Ġcomponent Type =$ component Type )" ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠComp Name Id : ĠNamed Ġ{ ĊĠĠĠ Ġval Ġcomponent Type : ĠComponent Type < *> Ċ } Ċ Ċ abstract Ġclass ĠComponent Builder < out ĠC Ġ: ĠComponent > Ġ{ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate Empty (): ĠC Ċ } Ċ Ċ data Ġclass ĠComponent Load Dispatcher < C Ġ: ĠComponent >( ĊĠĠĠ Ġval Ġload Dispatch : ĠComponent Ref Resolver < C >, ĊĠĠĠ Ġval Ġis Loaded : ĠComponent Ref Predicate < C >, ĊĠĠĠ Ġval Ġdispose Dispatch : ĠComponent Ref Resolver < C > Ċ )