/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ Ċ package Ġar cs . type Ċ Ċ import Ġar cs . common . Literal Ċ Ċ /** Ċ Ġ* ĠRegistry Ġfor Ġfunctions Ġto Ġturn Ġa Ġ[ Type Literal ] Ġinto Ġa Ġ[ Type ]. Ċ Ġ* Ċ Ġ* ĠWhen Ġimplementing Ġa Ġnew Ġ[ Type ], Ġit Ġis Ġsuggested Ġto Ġregister Ġyour Ġtype Ġwith Ġthe Ġ[ Type Factory ] Ċ Ġ* Ġwithin Ġan Ġ` init ` Ġblock Ġinside Ġof Ġa Ġ` comp anion Ġobject `. ĠFor Ġexample : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġclass ĠMy Type Ġ: ĠType Ġ{ Ċ Ġ* ĠĠ Ġoverride Ġval Ġtag : ĠTag Ġ= ĠTag . Something Ċ Ġ* Ċ Ġ* ĠĠ Ġoverride Ġfun Ġto Literal () Ġ= ĠLiteral ( tag ) Ċ Ġ* Ċ Ġ* ĠĠ Ġdata Ġclass ĠLiteral ( override Ġval Ġtag : ĠTag ) Ġ: ĠType Literal Ċ Ġ* Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġinit Ġ{ Ċ Ġ* ĠĠĠĠĠĠ ĠType Factory . register Builder ( Tag . Something ) Ġ{ ĠMy Type () Ġ} Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ object ĠType Factory Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġval Ġbuild ers Ġ= Ġmutable Map Of < Tag , Ġ( Type Literal ) Ġ-> ĠType >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġfunction Ġcapable Ġof Ġbuilding Ġa Ġ[ Type ] Ġgiven Ġa Ġ[ Type Literal ] Ġfor Ġthe Ġspecified ĊĠĠĠĠ Ġ* Ġ[ Tag ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Builder ( tag : ĠTag , Ġbuilder : Ġ( Type Literal ) Ġ-> ĠType ) Ġ= Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuild ers [ tag ] Ġ= Ġbuilder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġ[ Type ] Ġinstance Ġbased Ġon Ġthe Ġprovided Ġ[ Literal ]. Ġ*/ ĊĠĠĠ Ġfun ĠgetType ( literal : ĠLiteral ): ĠType Ġ= Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Literal Ġ= Ġrequire NotNull ( literal Ġas ? ĠType Literal ) Ġ{ Ġ" Type Literal Ġrequired " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġrequire NotNull ( builders [ type Literal . tag ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Type Ġwith Ġtag Ġ${ type Literal . tag } Ġhas Ġno Ġregistered Ġbuilder " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ( type Literal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠFor Ġuse Ġin Ġ` teardown ()` Ġmethods Ġin Ġtest Ġcases . ĠClear s Ġany Ġregistered Ġtype Ġbuild ers . Ġ*/ ĊĠĠĠ Ġ/* Ġinternal Ġ*/ Ġfun Ġclear Regist rations ForTesting () Ġ= Ġsynchronized ( lock ) Ġ{ Ġbuild ers . clear () Ġ} Ċ } Ċ