package Ġg uru . z oro ark . s hed inja . extensions Ċ Ċ import Ġg uru . z oro ark . s hed inja . environment . Declaration Ċ import Ġg uru . z oro ark . s hed inja . environment . Environment Context Ċ import Ġg uru . z oro ark . s hed inja . environment . Identifier Ċ import Ġg uru . z oro ark . s hed inja . environment . Injection Environment Ċ import Ġg uru . z oro ark . s hed inja . environment . Injection Environment Kind Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ Ċ /** Ċ Ġ* ĠAn Ġext ensible Ġinjection Ġenvironment Ġis Ġan Ġinjection Ġenvironment Ġthat Ġsupports Ġextensions . Ċ Ġ* Ċ Ġ* ĠWhile Ġsome Ġadditional Ġfeatures Ġ( such Ġas Ġ[ factories ][ guru . z oro ark . s hed inja . extensions . factory . put Factory ]) Ġcan Ġbe Ċ Ġ* Ġimplemented Ġpure ly Ġusing ĠS hed inja 's Ġpublic ĠAPI , Ġsome Ġextensions Ġsimply Ġcannot Ġdo Ġthis Ġand Ġrequire : Ċ Ġ* Ċ Ġ* Ġ- ĠAnalysis Ġof Ġdeclarations Ġoutside Ġof Ġtests . Ċ Ġ* Ġ- ĠState Ġstorage Ġwhen Ġjust Ġputting Ġmore Ġstuff Ġwithin Ġthe Ġenvironment Ġis Ġnot Ġfe asible . Ċ Ġ* Ċ Ġ* Ġ### ĠMeta - environments Ċ Ġ* Ċ Ġ* ĠExt ensible Ġenvironments Ġare , Ġat Ġtheir Ġcore , Ġenvironments Ġwith Ġan Ġadditional Ġsub - environment Ġnamed Ġthe Ġ" meta Ċ Ġ* Ġenvironment ". ĠBy Ġdefault , Ġmeta - environments Ġare Ġ[ E ager Immutable Meta Environment ] Ġobjects . ĠThis Ġmeta Ġenvironment Ġcan Ġbe Ċ Ġ* Ġused Ġto : Ċ Ġ* Ċ Ġ* Ġ- ĠStore Ġadditional Ġstates Ġ( via Ġregular ĠS hed inja Ġ[ put ][ guru . z oro ark . s hed inja . dsl . put ]/ [ get ][ Injection Environment . get ]/ Ċ Ġ* Ġ[ inject ][ Injection Environment . create Injector ] Ġmechanisms ). Ċ Ġ* Ġ- Ġ[ Process Ġdeclarations ][ Declarations Processor ] Ġthat Ġwere Ġput Ġin Ġthe Ġregular Ġenvironment . Ċ Ġ* Ċ Ġ* ĠYou Ġshould Ġnot Ġimplement Ġthis Ġinterface Ġdirectly Ġyourself : Ġsubclass Ġ[ Default Ext ensible Injection Environment ] Ġinstead , Ċ Ġ* Ġwhich Ġalready Ġhandles Ġall Ġthe Ġextensions - related Ġlogic . Ċ Ġ* Ċ Ġ* Ġ### ĠCon ventions Ċ Ġ* Ċ Ġ* ĠExt ensible Ġinjection Ġenvironments Ġshould Ġfollow Ġthe Ġsame Ġconventions Ġas Ġregular Ġinjection Ġenvironments , Ġespecially Ċ Ġ* Ġfor Ġdocumentation Ġand Ġusage . ĠHowever , Ġyou Ġ** must Ġnot ** Ġuse Ġ[ Injection Environment Kind ] Ġfor Ġextension Ġenvironments Ġ-- Ċ Ġ* Ġotherwise , Ġthe ĠDSL Ġwill Ġnot Ġsee Ġyour Ġenvironment Ġas Ġext ensible . ĠUse Ġ[ Ext ensible Injection Environment Kind ] Ġinstead . Ċ Ġ* Ċ Ġ* ĠIn Ġorder Ġto Ġuniform ly Ġdocument Ġext ensibility , Ġimplement ors Ġshould Ġinclude Ġthe Ġfollowing Ġline Ġin Ġtheir ĠK Doc Ġcomment : Ċ Ġ* Ċ Ġ* Ġ> ĠCompat ible Ġwith Ġinstall able Ġextensions . Ċ Ġ*/ Ċ interface ĠExt ensible Injection Environment Ġ: ĠInjection Environment Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmeta Ġenvironment Ġfor Ġthis Ġenvironment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġmeta Ġenvironment Ġ* must Ġnot * Ġbe Ġext ensible Ġitself . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmeta Environment : ĠInjection Environment ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġsequence Ġof Ġall Ġthe Ġknown Ġidentifiers Ġpresent Ġin Ġthis Ġenvironment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetAll Identifiers (): ĠSequence < Identifier <* >> Ċ } Ċ Ċ /** Ċ Ġ* ĠDefault Ġimplementation Ġfor Ġ[ Ext ensible Injection Environment ]. Ċ Ġ*/ Ċ abstract Ġclass ĠDefault Ext ensible Injection Environment ( ĊĠĠĠ Ġcontext : ĠExt ensible Environment Context , ĊĠĠĠ Ġmeta Context Kind : ĠInjection Environment Kind < *> Ġ= ĠE ager Immutable Meta Environment Ċ ) Ġ: ĠExt ensible Injection Environment Ġ{ ĊĠĠĠ Ġoverride Ġval Ġmeta Environment Ġ= Ġmeta Context Kind . build ( context . meta Context . let Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInject Ġthe ĠE IE Ġwithin Ġthe Ġmeta - environment ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= ĠDeclaration ( Identifier ( Ext ensible Injection Environment :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Default Ext ensible Injection Environment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Declarations Ġ= Ġit . declarations . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġnew Declarations [ declaration . identifier ] Ġ= Ġdeclaration ĊĠĠĠĠĠĠĠ ĠEnvironment Context ( new Declarations ) ĊĠĠĠ Ġ}). also Ġ{ Ġmeta Environment Ġ-> ĊĠĠĠĠĠĠĠ Ġcontext . meta Context . declarations . keys . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . k class . is Subclass Of ( Declarations Processor :: class ) ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġprocessor Identifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġmeta Environment . get ( processor Identifier ) Ġas ? ĠDecl arations Processor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Internal Ġerror : Ġprocessor Ġhas Ġan Ġidentifier Ġdeclaring Ġit Ġis Ġa Ġsubclass Ġof Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Declarations Processor , Ġbut Ġthe Ġactual Ġobject Ġis Ġnot ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . process Declarations ( context . declarations . values . as Sequence ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ