package Ġio . j ent z . w inter . delegate Ċ Ċ import Ġio . j ent z . w inter .* Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġproperty Ġdelegate Ġfor Ġa Ġ[ Provider ] Ġof Ġtype Ġ` () Ġ-> ĠR `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier . Ċ Ġ* Ġ@ param Ġgener ics ĠPre serve Ġgeneric Ġtype Ġparameters . Ċ Ġ* Ġ@ return ĠThe Ġcreated Ġ[ Inject ed Property ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny > Ġinject Provider ( ĊĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġgener ics : ĠBoolean Ġ= Ġfalse Ċ ): ĠInject ed Property < Provider < R >> Ġ= ĠProvider Property ( type Key ( qual ifier , Ġgener ics )) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġproperty Ġdelegate Ġfor Ġan Ġoptional Ġ[ Provider ] Ġof Ġtype Ġ` R `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier . Ċ Ġ* Ġ@ param Ġgener ics ĠPre serve Ġgeneric Ġtype Ġparameters . Ċ Ġ* Ġ@ return ĠThe Ġcreated Ġ[ Inject ed Property ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny > Ġinject Provider OrNull ( ĊĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġgener ics : ĠBoolean Ġ= Ġfalse Ċ ): ĠInject ed Property < Provider < R > ?> Ġ= ĠProvider OrNull Property ( type Key ( qual ifier , Ġgener ics )) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġproperty Ġdelegate Ġfor Ġan Ġinstance Ġof Ġtype Ġ` R `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier . Ċ Ġ* Ġ@ param Ġgener ics ĠPre serve Ġgeneric Ġtype Ġparameters . Ċ Ġ* Ġ@ return ĠThe Ġcreated Ġ[ Inject ed Property ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny > Ġinject ( ĊĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġgener ics : ĠBoolean Ġ= Ġfalse Ċ ): ĠInject ed Property < R > Ġ= ĠInstance Property ( type Key ( qual ifier , Ġgener ics )) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġproperty Ġdelegate Ġfor Ġan Ġoptional Ġinstance Ġof Ġtype Ġ` R `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier . Ċ Ġ* Ġ@ param Ġgener ics ĠPre serve Ġgeneric Ġtype Ġparameters . Ċ Ġ* Ġ@ return ĠThe Ġcreated Ġ[ Inject ed Property ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny > Ġinject OrNull ( ĊĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġgener ics : ĠBoolean Ġ= Ġfalse Ċ ): ĠInject ed Property < R ?> Ġ= ĠInstance OrNull Property ( type Key ( qual ifier , Ġgener ics )) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġlazy Ġproperty Ġdelegate Ġfor Ġan Ġinstance Ġof Ġtype Ġ` R `. Ċ Ġ* Ċ Ġ* ĠThe Ġinstance Ġgets Ġretrieved / created Ġon Ġfirst Ġproperty Ġaccess . Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier . Ċ Ġ* Ġ@ param Ġgener ics ĠPre serve Ġgeneric Ġtype Ġparameters . Ċ Ġ* Ġ@ return ĠThe Ġcreated Ġ[ Inject ed Property ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny > Ġinject Lazy ( ĊĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġgener ics : ĠBoolean Ġ= Ġfalse Ċ ): ĠInject ed Property < R > Ġ= ĠLazy Instance Property ( type Key ( qual ifier , Ġgener ics )) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġlazy Ġproperty Ġdelegate Ġfor Ġan Ġoptional Ġinstance Ġof Ġtype Ġ` R `. Ċ Ġ* Ċ Ġ* ĠThe Ġinstance Ġgets Ġretrieved / created Ġon Ġfirst Ġproperty Ġaccess . Ċ Ġ* Ċ Ġ* Ġ@ param Ġqualifier ĠAn Ġoptional Ġqualifier . Ċ Ġ* Ġ@ param Ġgener ics ĠPre serve Ġgeneric Ġtype Ġparameters . Ċ Ġ* Ġ@ return ĠThe Ġcreated Ġ[ Inject ed Property ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠR Ġ: ĠAny > Ġinject Lazy OrNull ( ĊĠĠĠ Ġqualifier : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġgener ics : ĠBoolean Ġ= Ġfalse Ċ ): ĠInject ed Property < R ?> Ġ= ĠLazy Instance OrNull Property ( type Key ( qual ifier , Ġgener ics )) Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġof Ġall Ġinjected Ġproperties . Ċ Ġ*/ Ċ abstract Ġclass ĠInject ed Property < out ĠT > Ġ: ĠReadOnly Property < Any ?, ĠT > Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġvalue : ĠT ĊĠĠĠ Ġabstract Ġfun Ġinject ( graph : ĠGraph ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġa Ġfunction Ġto Ġthe Ġretrieved Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< R > Ġmap ( mapper : Ġ( T ) Ġ-> ĠR ): ĠInject ed Property < R > Ġ= ĊĠĠĠĠĠĠĠ ĠProperty Mapper ( this , Ġmapper ) ĊĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( this Ref : ĠAny , Ġprop : ĠK Property < *> ): ĠInject ed Property < T > Ġ{ ĊĠĠĠĠĠĠĠ ĠDelegate Notifier . register ( this Ref , Ġthis ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn initialized Property AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠW inter Exception (" Inject ed Ġproperty Ġ`${ property . name }` Ġnot Ġinitialized .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠProperty Mapper < in ĠI , Ġout ĠO >( ĊĠĠĠ Ġbase : ĠInject ed Property < I >, ĊĠĠĠ Ġmapper : Ġ( I ) Ġ-> ĠO Ċ ) Ġ: ĠInject ed Property < O >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġbase : ĠInject ed Property < I >? Ġ= Ġbase ĊĊĠĠĠ Ġprivate Ġvar Ġmapper : Ġ(( I ) Ġ-> ĠO )? Ġ= Ġmapper ĊĊĠĠĠ Ġoverride Ġval Ġvalue : ĠO Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfn Ġ= Ġthis . mapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" BUG : ĠProperty Mapper Ġmapper Ġ== Ġnull ") ĊĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġthis . base ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" BUG : ĠProperty Mapper Ġbase Ġ== Ġnull ") ĊĊĠĠĠĠĠĠĠ Ġthis . base Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . mapper Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfn ( property . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinject ( graph : ĠGraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbase ?. inject ( graph ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġabstract Ġclass ĠAbstract E ager Property < R Ġ: ĠAny , ĠT >( ĊĠĠĠ Ġprivate Ġval Ġkey : ĠType Key < R > Ċ ) Ġ: ĠInject ed Property < T >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ value : ĠAny ? Ġ= ĠUN INITIAL IZED _ VALUE ĊĊĠĠĠ Ġfinal Ġoverride Ġval Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ value Ġ== ĠUN INITIAL IZED _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn initialized Property AccessException (" Property Ġnot Ġinitialized .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ value Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġinject ( graph : ĠGraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ value Ġ= ĠgetValue ( graph , Ġkey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠT Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġabstract Ġclass ĠAbstract Lazy Property < R Ġ: ĠAny , ĠT >( ĊĠĠĠ Ġprivate Ġval Ġkey : ĠType Key < R > Ċ ) Ġ: ĠInject ed Property < T >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġgraph : ĠGraph ? Ġ= Ġnull ĊĊĠĠĠ Ġfinal Ġoverride Ġval Ġvalue : ĠT Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= Ġthis . graph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠUn initialized Property AccessException (" Property Ġnot Ġinitialized .") ĊĊĠĠĠĠĠĠĠ ĠgetValue ( graph , Ġkey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġinject ( graph : ĠGraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . graph Ġ= Ġgraph ĊĠĠĠĠĠĠĠ Ġresolve Factory ( graph , Ġkey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġresolve Factory ( graph : ĠGraph , Ġkey : ĠType Key < R >) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠT Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠInstance Property < R Ġ: ĠAny >( ĊĠĠĠ Ġkey : ĠType Key < R > Ċ ) Ġ: ĠAbstract E ager Property < R , ĠR >( key ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠR Ġ= ĊĠĠĠĠĠĠĠ Ġgraph . instance ByKey ( key ) Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠInstance OrNull Property < R Ġ: ĠAny >( ĊĠĠĠ Ġkey : ĠType Key < R > Ċ ) Ġ: ĠAbstract E ager Property < R , ĠR ? >( key ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠR ? Ġ= ĊĠĠĠĠĠĠĠ Ġgraph . instance OrNull ByKey ( key ) Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠLazy Instance Property < R Ġ: ĠAny >( ĊĠĠĠ Ġkey : ĠType Key < R > Ċ ) Ġ: ĠAbstract Lazy Property < R , ĠR >( key ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprovider : ĠProvider < R > ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Factory ( graph : ĠGraph , Ġkey : ĠType Key < R >) Ġ{ ĊĠĠĠĠĠĠĠ Ġprovider Ġ= Ġgraph . provider ByKey ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠR Ġ= Ġprovider () Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠLazy Instance OrNull Property < R Ġ: ĠAny >( ĊĠĠĠ Ġkey : ĠType Key < R > Ċ ) Ġ: ĠAbstract Lazy Property < R , ĠR ? >( key ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġprovider : ĠProvider < R >? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġresolve Factory ( graph : ĠGraph , Ġkey : ĠType Key < R >) Ġ{ ĊĠĠĠĠĠĠĠ Ġprovider Ġ= Ġgraph . provider OrNull ByKey ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠR ? Ġ= ĊĠĠĠĠĠĠĠ Ġprovider ?. invoke () Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠProvider Property < R Ġ: ĠAny >( ĊĠĠĠ Ġkey : ĠType Key < R > Ċ ) Ġ: ĠAbstract E ager Property < R , ĠProvider < R >>( key ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠProvider < R > Ġ= ĊĠĠĠĠĠĠĠ Ġgraph . provider ByKey ( key ) Ċ Ċ } Ċ Ċ @ Published Api Ċ internal Ġclass ĠProvider OrNull Property < R Ġ: ĠAny >( ĊĠĠĠ Ġkey : ĠType Key < R > Ċ ) Ġ: ĠAbstract E ager Property < R , ĠProvider < R >? >( key ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( graph : ĠGraph , Ġkey : ĠType Key < R >): ĠProvider < R >? Ġ= ĊĠĠĠĠĠĠĠ Ġgraph . provider OrNull ByKey ( key ) Ċ Ċ } Ċ