/* Ċ Ġ* ĠĠĠĠĠ ĠEvent Sys Ġ- ĠEvent Ġimplementation Ġgenerator Ġwritten Ġon Ġtop Ġof ĠK ores Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠProject Sand stone Ġ< https :// github . com / Project Sand stone / Event Sys > Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* ĠĠĠĠĠ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* ĠĠĠĠĠ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* ĠĠĠĠĠ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* ĠĠĠĠĠ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* ĠĠĠĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* ĠĠĠĠĠ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠĠĠĠĠ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠĠĠĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠĠĠĠĠ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠĠĠĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠĠĠĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . github . k ores framework . event sys . gen . event Ċ Ċ import Ġcom . github . jon athan xd . i utils .` object `. Tri state Ċ import Ġcom . github . jon athan xd . i utils . map . Concurrent List Map Ċ import Ġcom . github . jon athan xd . i utils . option . Options Ċ import Ġcom . github . jon athan xd . k ores . base . Class Declaration Ċ import Ġcom . github . jon athan xd . k ores . base . Method Declaration Ċ import Ġcom . github . jon athan xd . k ores . type .` is ` Ċ import Ġcom . github . jon athan xd . k ores . type . bin ded Default Resolver Ċ import Ġcom . github . jon athan xd . k ores . type . canonical Name Ċ import Ġcom . github . k ores framework . event sys . context . Environment Context Ċ import Ġcom . github . k ores framework . event sys . event . Event Ċ import Ġcom . github . k ores framework . event sys . event . EventListener Ċ import Ġcom . github . k ores framework . event sys . event . Listener Spec Ċ import Ġcom . github . k ores framework . event sys . extension . Extension Specification Ċ import Ġcom . github . k ores framework . event sys . gen . Common Generation Environment Ċ import Ġcom . github . k ores framework . event sys . gen . Generation Environment Ċ import Ġcom . github . k ores framework . event sys . gen . Res olvable Declaration Ċ import Ġcom . github . k ores framework . event sys . gen . check . Check Handler Ċ import Ġcom . github . k ores framework . event sys . gen . check . Default Check Handler Ċ import Ġcom . github . k ores framework . event sys . logging . Logger Interface Ċ import Ġcom . github . k ores framework . event sys . reflect . isEqual Ċ import Ġcom . github . k ores framework . event sys . util . ES ys Executor Ċ import Ġcom . github . k ores framework . event sys . util . Event Implementation Generation Failure Ċ import Ġcom . github . k ores framework . event sys . util . is Public Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . function . Supplier Ċ Ċ class ĠCommon Event Generator Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġlogger : ĠLogger Interface , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġgeneration Environment : ĠGeneration Environment Ġ= ĠCommon Generation Environment () Ċ ) Ġ: ĠEvent Generator Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfactory Impl Cache Ġ= ĠConcurrent HashMap < Type , ĠRes olvable Declaration <* >>() ĊĠĠĠ Ġprivate Ġval Ġevent Impl Cache Ġ= ĠConcurrent HashMap < Event Class , ĠRes olvable Declaration < Class <* >> >() ĊĠĠĠ Ġprivate Ġval Ġlistener Impl Cache Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConcurrent HashMap < Method Declaration , ĠRes olvable Declaration < Class < out ĠEvent Listener < Event >>>> () ĊĊĠĠĠ Ġprivate Ġval Ġextension Map Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConcurrent List Map < Type , ĠExtension Specification >( Concurrent HashMap ()) ĊĊĠĠĠ Ġ// ĠNot Ġsynchronized ĊĠĠĠ Ġoverride Ġval Ġoptions : ĠOptions Ġ= ĠOptions ( Concurrent HashMap ()) ĊĠĠĠ Ġoverride Ġvar Ġcheck Handler : ĠCheck Handler Ġ= ĠDefault Check Handler () ĊĊĠĠĠ Ġ// ĠExecutor ĊĠĠĠ Ġprivate Ġval Ġexecutor Ġ= ĠE Sys Executor ( this . options , ĠExec utors . new Cached ThreadPool ()) ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġcreate Factory Async ( factory Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ): ĠCompletableFuture < Res olvable Declaration < T >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . supply Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSupplier < Res olvable Declaration < T >> Ġ{ Ġthis . create Factory ( factory Type , Ġctx ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . executor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠEvent > Ġcreate Event Class Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Properties : ĠList < PropertyInfo >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions : ĠList < Extension Specification >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠCompletableFuture < Res olvable Declaration < Class < out ĠT >>> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . supply Async ( Supplier < Res olvable Declaration < Class < out ĠT >>> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Event Class ( type , Ġadditional Properties , Ġextensions , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġthis . executor ) ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Method Listener Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Class : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Spec : ĠListener Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠCompletableFuture < Res olvable Declaration < EventListener < Event >>> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . supply Async ( Supplier < Res olvable Declaration < EventListener < Event >>> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Method Listener ( listener Class , Ġmethod , Ġinstance , Ġlistener Spec , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġthis . executor ) ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Method Listener Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Class : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Spec : ĠListener Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠCompletableFuture < Res olvable Declaration < EventListener < Event >>> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . supply Async ( Supplier < Res olvable Declaration < EventListener < Event >>> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Method Listener ( listener Class , Ġmethod , Ġinstance , Ġlistener Spec , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġthis . executor ) ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Method Listener Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Class : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Spec : ĠListener Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠCompletableFuture < Res olvable Declaration < Class < out ĠEvent Listener < Event >>>> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . supply Async ( Supplier < Res olvable Declaration < Class < out ĠEvent Listener < Event >>>> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Method Listener ( listener Class , Ġmethod , Ġlistener Spec , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġthis . executor ) ĊĊĠĠĠ Ġoverride Ġfun Ġregister Extension ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Specification : ĠExtension Specification ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . extension Map [ base ]?. contains ( extension Specification ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġthis . extension Map . put ToList ( base , Ġextension Specification ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠEvent > Ġregister Event Implementation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Class Specification : ĠEvent Class Specification , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation : ĠClass < out ĠT > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevt Class Ġ= ĠEvent Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Class Specification . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Class Specification . additional Properties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Class Specification . extensions ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġthis . event Impl Cache [ evt Class ] Ġ= ĠRes olvable Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Declaration Ġ= Ġthis . generation Environment . declaration Cache [ implementation ] Ġas ĠClass Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Ġ= Ġ{ Ġimplementation Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġcreate Factory ( factory Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ): ĠRes olvable Declaration < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . factory Impl Cache . compute If Absent ( factory Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Factory ClassGenerator . create < T >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . generation Environment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠRes olvable Declaration < T > ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠEvent > Ġcreate Event Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Properties : ĠList < PropertyInfo >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions : ĠList < Extension Specification >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠRes olvable Declaration < Class < out ĠT >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Public () Ġ== ĠTri state . FALSE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEvent Implementation Generation Failure (" The Ġprovided Ġ'${ type . canonical Name }' Ġfor Ġevent Ġimplementation Ġgeneration Ġmust Ġbe Ġpublic .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurr Ex ts Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . extension Map [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthis . extension Map . entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġ( k , Ġ_) Ġ-> Ġk .` is `( type ) Ġ} ?. value ). or Empty () ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Class Ġ= ĠEvent Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Properties , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Ex ts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextensions ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcleanup ( event Class ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . event Impl Cache . compute If Absent ( event Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ClassGenerator . gen Implementation < T >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Class . spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . generation Environment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠRes olvable Declaration < Class < out ĠT >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġold Ġevent Ġimplementation Ġclasses Ġthat Ġdoes Ġnot Ġhave Ġsame Ġextensions Ġas Ġcurrent Ġextensions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcleanup ( event Class : ĠEvent Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this . event Impl Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . event Impl Cache . keys . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . curr Ex ts Ġ!= Ġevent Class . curr Ex ts Ġ&& Ġit . user Ex ts Ġ== Ġevent Class . user Ex ts Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġthis . event Impl Cache . remove ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Method Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Class : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Spec : ĠListener Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠRes olvable Declaration < Class < out ĠEvent Listener < Event >>> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . listener Impl Cache . compute If Absent ( method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Listener Generator . createClass ( listener Class , Ġit , Ġlistener Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Method Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Class : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod Declaration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Spec : ĠListener Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠRes olvable Declaration < EventListener < Event >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Method Listener ( listener Class , Ġmethod , Ġlistener Spec , Ġctx ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Listener Generator . create ( it , Ġmethod , Ġinstance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Method Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Class : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠMethod , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Spec : ĠListener Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠEnvironment Context ĊĠĠĠ Ġ): ĠRes olvable Declaration < EventListener < Event >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . generation Environment . declaration Cache [ listener Class ]. methods . first Ġ{ Ġit . isEqual ( method ) Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Method Listener ( listener Class , Ġit , Ġinstance , Ġlistener Spec , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Listener Spec From Method ( method : ĠMethod ): ĠListener Spec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Listener Spec From Method ( this . generation Environment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. declaration Cache [ method . decl aring Class ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. methods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isEqual ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Listener Spec From Method ( method : ĠMethod Declaration ): ĠListener Spec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Spec . from Method Declaration ( method ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠEvent Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Info : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Properties : ĠList < PropertyInfo >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Ex ts : ĠList < Extension Specification >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ex ts : ĠList < Extension Specification > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspec : ĠEvent Class Specification Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Class Specification ( type Info , Ġadditional Properties , Ġcurr Ex ts Ġ+ Ġuser Ex ts ) ĊĠĠĠ Ġ} Ċ Ċ }