package Ġexample . mesos Ċ Ċ import Ġexample . mesos . common . Log gable Ċ import Ġkotlinx . coroutines . experimental . channels . Send Channel Ċ import Ġkotlin . reflect . K Class Ċ Ċ object ĠObject Registry Ġ: ĠLog gable Ġ{ ĊĠĠĠ Ġval Ġobjects : ĠMutable Map < String , ĠAny > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġregistry ( k Class : ĠK Class < T >, Ġservice : Ġ() Ġ-> ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġk Class . qualified Name !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ! in Ġobjects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Register ing Ġ${ k Class . qualified Name }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġservice () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġis ĠObject Manage able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . onStart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects [ name ] Ġ= Ġobj ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġget (): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠT :: class . qualified Name !! ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobjects [ name ] Ġas ? ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠA , ĠB > Ġget WithType (): ĠB ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠA :: class . qualified Name !! ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġobjects [ name ] Ġas ? ĠB ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġobjects . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠObject Manage able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġis ĠSend Channel <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }