package Ġme . b ri ster mit ten . pl umber . new files Ċ Ċ import Ġcom . google . inject . Inject Ċ import Ġcom . google . inject . Module Ċ import Ġme . b ri ster mit ten . pl umber . aspect . Abstract Aspect Ċ import Ġme . b ri ster mit ten . pl umber . aspect . Required Aspect Ċ import Ġme . b ri ster mit ten . pl umber . new files . store . Store Ċ import Ġme . b ri ster mit ten . pl umber . new files . store . Store Factory Ċ import Ġme . b ri ster mit ten . pl umber . new files . store . Store Proxy Handler Ċ import Ġme . b ri ster mit ten . pl umber . new files . store . id . ID Resolvers Ċ import Ġme . b ri ster mit ten . pl umber . new files . store . id . Resolver Config Ċ import Ġme . b ri ster mit ten . pl umber . reflection . Class Finder Ċ import Ġme . b ri ster mit ten . pl umber . util . Reflection . create Gu ice Module Ċ import Ġjava . lang . reflect . Proxy Ċ import Ġkotlin . streams . toList Ċ Ċ /** Ċ Ġ* Ġ@ author ĠAlex ander ĠW ood Ġ( B ri ster Mit ten ) Ċ Ġ*/ Ċ @ Required Aspect Ċ class ĠFiles Aspect Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġid Resolvers : ĠID Resolvers , ĊĠĠĠ Ġprivate Ġval Ġclass Finder : ĠClass Finder , ĊĠĠĠ Ġprivate Ġval Ġstore Factory : ĠStore Factory , ĊĠĠĠ Ġprivate Ġval Ġclass Loader : ĠClassLoader Ċ ) Ġ: ĠAbstract Aspect () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġstores : ĠCollection < Store < *, Ġ* >> Ġ= ĠArrayList () ĊĊĠĠĠ Ġoverride Ġfun Ġdo Enable () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclass Finder . get Real Classes Implement ing < Resolver Config >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġinstance ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . register Resolvers ( id Resolvers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstores Ġ= Ġclass Finder . get Classes Implement ing < Store < *, Ġ* >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. parallel Stream (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġit Ġas ĠClass < Store < Any , ĠAny >> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Created Ġimplementation Ġfor Ġ{}", Ġclazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Factory . create Store Implementation ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Module (): ĠModule Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Gu ice Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( store Ġin Ġstores ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠProxy . get Invocation Handler ( store ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Ġ! is ĠStore Proxy Handler < *, Ġ* >) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ġval Ġstore Class Ġ= Ġhandler . proxy ing Ġas ĠClass < Store < *, Ġ* >> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( store Class ). to Instance ( store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ