package Ġcom . github . ni uh f 0 4 5 2 . ex ile . inject . binder Ċ Ċ import Ġcom . github . ni uh f 0 4 5 2 . ex ile . inject . Injector Ċ import Ġcom . github . ni uh f 0 4 5 2 . ex ile . inject . Injector Builder Ċ import Ġcom . github . ni uh f 0 4 5 2 . ex ile . inject . Type Key Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . full . star Project ed Type Ċ Ċ class ĠStatic Binder ( config : Ġ( Injector Builder . Configurator ) Ġ-> ĠUnit ) Ġ: ĠInject or . Binder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbinder Call Map Ġ= ĠConfigurator Impl (). run ( config ) ĊĊĠĠĠ Ġoverride Ġfun Ġbind ( key : ĠType Key , Ġcontext : ĠInject or . Binding Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinder Call Map [ key ]?. forEach Ġ{ Ġc Ġ-> Ġc ( context ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠConfigurator Impl Ġ: ĠInject or Builder . Configurator Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbinder Calls Ġ= Ġmutable Map Of < Type Key , ĠMutable List <( Injector . Binding Context ) Ġ-> ĠUnit >>() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( type : ĠK Type ): ĠInject or Builder . Binding Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠType Key ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġbinder Calls . compute If Absent ( key ) Ġ{ Ġmutable ListOf () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBinding Builder Impl ( key , Ġcalls ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( cls : ĠK Class < *> ): ĠInject or Builder . Binding Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cls . type Parameters . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġbind Ġgeneric Ġclass : Ġ$ cls ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbind ( cls . star Project ed Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrun ( configure : Ġ( Injector Builder . Configurator ) Ġ-> ĠUnit ): ĠMap < Type Key , ĠList <( Injector . Binding Context ) Ġ-> ĠUnit >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbinder Calls ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠBinding Builder Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey : ĠType Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcalls : ĠMutable List <( Injector . Binding Context ) Ġ-> ĠUnit > ĊĠĠĠ Ġ) Ġ: ĠInject or Builder . Binding Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto Type ( type : ĠType Key , Ġqual ifiers : ĠList < Annotation >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . classifier Ġ== Ġkey . classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Don 't Ġbind Ġclass Ġto Ġitself : Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! key . isAssignableFrom ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġimplementation Ġtype Ġdoesn 't Ġcomp ly Ġto Ġthe Ġbind Ġtype : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bind Ġtype Ġ= Ġ$ key , Ġimplementation Ġtype Ġ= Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalls . add Ġ{ Ġc Ġ-> Ġc . bind To Type ( qual ifiers , Ġtype ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto Instance ( instance : ĠAny , Ġqual ifiers : ĠList < Annotation >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! key . classifier . is Instance ( instance )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġtype Ġof Ġinstance Ġdoesn 't Ġcomp ly Ġto Ġthe Ġbind Ġtype : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bind Ġtype Ġ= Ġ$ key , Ġinstance Ġtype Ġ= Ġ${ instance :: class }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalls . add Ġ{ Ġc Ġ-> Ġc . bind To Instance ( qual ifiers , Ġinstance ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto Provider ( qual ifiers : ĠList < Annotation >, Ġprovider : Ġ() Ġ-> ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Provider ( qual ifiers , ĠProvider Adapter ( provider )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto Provider ( qual ifiers : ĠList < Annotation >, Ġprovider : ĠInject or . Provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalls . add Ġ{ Ġc Ġ-> Ġc . bind To Provider ( qual ifiers , Ġprovider ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠProvider Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġprovider : Ġ() Ġ-> ĠAny ĊĠĠĠ Ġ) Ġ: ĠInject or . Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetInstance (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprovider () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Provider Adapter ($ provider )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }