/** Ċ Ġ* Ġ" Common s ĠClause " ĠLicense ĠCondition Ġv 1 . 0 Ċ Ġ* Ċ Ġ* ĠThe ĠSoftware Ġis Ġprovided Ġto Ġyou Ġby Ġthe ĠLic ensor Ġunder Ġthe ĠLicense , Ġas Ġdefined Ċ Ġ* Ġbelow , Ġsubject Ġto Ġthe Ġfollowing Ġcondition . Ċ Ġ* Ċ Ġ* ĠWithout Ġlimiting Ġother Ġconditions Ġin Ġthe ĠLicense , Ġthe Ġgrant Ġof Ġrights Ġunder Ġthe Ċ Ġ* ĠLicense Ġwill Ġnot Ġinclude , Ġand Ġthe ĠLicense Ġdoes Ġnot Ġgrant Ġto Ġyou , Ġthe Ġright Ġto Ċ Ġ* ĠS ell Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠFor Ġpurposes Ġof Ġthe Ġfore going , ĠâĢľ Sell âĢĿ Ġmeans Ġpract icing Ġany Ġor Ġall Ġof Ġthe Ġrights Ċ Ġ* Ġgranted Ġto Ġyou Ġunder Ġthe ĠLicense Ġto Ġprovide Ġto Ġthird Ġparties , Ġfor Ġa Ġfee Ġor Ċ Ġ* Ġother Ġconsideration Ġ( including Ġwithout Ġlimitation Ġfees Ġfor Ġhosting Ġor Ċ Ġ* Ġconsult ing / Ġsupport Ġservices Ġrelated Ġto Ġthe ĠSoftware ), Ġa Ġproduct Ġor Ġservice Ċ Ġ* Ġwhose Ġvalue Ġder ives , Ġentirely Ġor Ġsubstant ially , Ġfrom Ġthe Ġfunctionality Ġof Ġthe Ċ Ġ* ĠSoftware . ĠAny Ġlicense Ġnotice Ġor Ġat tribution Ġrequired Ġby Ġthe ĠLicense Ġmust Ġalso Ċ Ġ* Ġinclude Ġthis ĠCommons ĠClause ĠLicense ĠCondition Ġnotice . Ċ Ġ* Ċ Ġ* ĠSoftware : ĠInf init ic Ċ Ġ* Ċ Ġ* ĠLicense : ĠMIT ĠLicense Ġ( https :// opensource . org / licenses / MIT ) Ċ Ġ* Ċ Ġ* ĠLic ensor : Ġinf init ic . io Ċ Ġ*/ Ċ Ċ package Ġio . inf init ic . common . proxies Ċ Ċ import Ġio . inf init ic . annotations . Name Ċ import Ġio . inf init ic . common . data . methods . MethodName Ċ import Ġio . inf init ic . common . data . methods . Method Parameter Types Ċ import Ġio . inf init ic . common . data . methods . Method Parameters Ċ import Ġio . inf init ic . exceptions . workflows . Invalid Inline Exception Ċ import Ġio . inf init ic . workflows . Send Channel Ċ import Ġjava . lang . reflect . Invocation Handler Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Proxy Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ Ċ sealed Ġclass ĠProxy Handler < T Ġ: ĠAny >( ĊĠĠĠ Ġopen Ġval Ġklass : ĠClass < out ĠT >, ĊĠĠĠ Ġopen Ġval Ġdispatcher Fn : Ġ() Ġ-> ĠProxy Dispatcher Ċ ) Ġ: ĠInvocation Handler Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġval ĠisIn lined : ĠThread Local < Boolean > Ġ= ĠThread Local . with Initial Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġval Ġis Invocation Async : ĠThread Local < Boolean > Ġ= ĠThread Local . with Initial Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġval Ġinvocation Handler : ĠThread Local < Proxy Handler < *> ?> Ġ= ĠThread Local . with Initial Ġ{ Ġnull Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< R > Ġasync ( f ct : Ġ() Ġ-> ĠR ): ĠProxy Handler < *> ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isIn lined . get ()) Ġthrow ĠInvalid Inline Exception ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġinvocation Ġflag Ġto ĠAsync ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Invocation Async . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcall Ġthe Ġmethod Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġinvocation Handler . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġdefault Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Invocation Async . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Handler . set ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandler ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġcan Ġbe Ġused Ġto Ġget Ġthe Ġresult Ġof Ġf ct () ĊĠĠĠĠĠĠĠĠ Ġ* Ġan ĠInvalid Inline Exception Ġis Ġthrown Ġif Ġ` f ct ` Ġuses Ġa Ġproxy ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< R > Ġinline ( f ct : Ġ() Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisIn lined . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisIn lined . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġcalled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġmethod : ĠMethod ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠArgs Ġof Ġmethod Ġcalled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġmethod Args : ĠArray < out ĠAny > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠName Ġprovided Ġby Ġ@ Name Ġannotation , Ġif Ġany ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġclass Annotated Name : ĠString ? Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfind ClassName Per Annotation ( klass ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClass Ġname Ġprovided Ġby Ġ@ Name Ġannotation , Ġor Ġjava Ġclass Ġname Ġby Ġdefault ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġname : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Annotated Name Ġ?: Ġklass . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimple Name Ġprovided Ġby Ġ@ Name Ġannotation , Ġor Ġclass Ġname Ġby Ġdefault ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsimple Name : ĠString ĊĠĠĠĠĠĠĠ Ġ// ĠMUST Ġbe Ġa Ġget () Ġas Ġthis . methodName Ġcan Ġchange Ġwhen Ġre using Ġinstance ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"${ class Annotated Name Ġ?: Ġklass . simple Name } ::$ methodName " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Name Ġprovided Ġby Ġ@ Name Ġannotation , Ġor Ġjava Ġmethod Ġname Ġby Ġdefault ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠmethodName : ĠMethod Name ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠMUST Ġbe Ġa Ġget () Ġas Ġthis . method Ġchanges ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠMethod Name ( find MethodName Per Annotation ( klass , Ġmethod ) Ġ?: Ġmethod . name ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Parameter Types Ġfrom Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmethod Parameter Types : ĠMethod Parameter Types ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠMUST Ġbe Ġa Ġget () Ġas Ġthis . method Ġchanges ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠMethod Parameter Types . from ( method ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Type Ġfrom Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠreturnType : ĠClass < *> ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠMUST Ġbe Ġa Ġget () Ġas Ġthis . method Ġchanges ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmethod . returnType ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Parameters Ġfrom Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmethod Parameters : ĠMethod Parameters ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠMUST Ġbe Ġa Ġget () Ġas Ġthis . method Ġchanges ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠMethod Parameters . from ( method , Ġmethod Args ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġprovides Ġa Ġstub Ġof Ġtype ĠT ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġstub () Ġ= ĠProxy . new Proxy Instance ( ĊĠĠĠĠĠĠĠ Ġklass . class Loader , ĊĠĠĠĠĠĠĠ ĠarrayOf ( klass ), ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ) Ġas ĠT ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( proxy : ĠAny , Ġmethod : ĠMethod , Ġargs : ĠArray < out ĠAny >? ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isIn lined . get ()) Ġthrow ĠInvalid Inline Exception ĊĊĠĠĠĠĠĠĠ Ġval Ġany Ġ= Ġget Async ReturnValue ( method ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method . decl aring Class Ġ== ĠObject :: class . java ) Ġreturn Ġwhen Ġ( method . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" toString " Ġ-> Ġklass . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġany ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . method Ġ= Ġmethod ĊĠĠĠĠĠĠĠ Ġthis . method Args Ġ= Ġargs Ġ?: ĠarrayOf () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( is Invocation Async . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsync Ġ=> Ġrun Ġdirectly Ġfrom Ġdispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġdispatcher Fn (). dispatch And Wait ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstore Ġcurrent Ġinstance Ġto Ġget Ġretrieved Ġfrom ĠProxy Handler . async ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġcurrent Ġhandler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Handler . set ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġfake Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġmethod Ġis Ġa Ġgetter Ġon Ġa ĠSend Channel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Channel Getter (): ĠBoolean Ġ= Ġmethod . returnType . kotlin . is Subclass Of ( Send Channel :: class ) ĊĊĠĠĠ Ġ// ĠReturns Ġa Ġtype - compatible Ġvalue Ġto Ġavoid Ġan Ġexception Ġat Ġruntime ĊĠĠĠ Ġprivate Ġfun Ġget Async ReturnValue ( method : ĠMethod ) Ġ= Ġwhen Ġ( method . returnType . name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" long " Ġ-> Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ" int " Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ" short " Ġ-> Ġ 0 . to Short () ĊĠĠĠĠĠĠĠ Ġ" byte " Ġ-> Ġ 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġ 0 . toDouble () ĊĠĠĠĠĠĠĠ Ġ" float " Ġ-> Ġ 0 . toFloat () ĊĠĠĠĠĠĠĠ Ġ" char " Ġ-> Ġ 0 . to Char () ĊĠĠĠĠĠĠĠ Ġ" boolean " Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġsearch Ġfor Ġa Ġ@ Name Ġannotation Ġgiven Ġby Ġuser Ġto Ġthis Ġmethod , Ġin Ġthe Ġclass , Ġits Ġinterfaces , Ġor Ġits Ġparent ĊĠĠĠ Ġprivate Ġfun Ġfind MethodName Per Annotation ( klass : ĠClass <* >, Ġmethod : ĠMethod ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclazz Ġ= Ġklass ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġcurrent Ġclass Ġa Ġ@ Name Ġannotation Ġon Ġthe Ġtargeted Ġmethod ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . getMethod ( method . name , Ġ* method . parameter Types ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . is Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAnnotation ( Name :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġreturn Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġany Ġof Ġthe Ġinterfaces Ġa Ġ@ Name Ġannotation Ġon Ġthe Ġtargeted Ġmethod ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . interfaces . forEach Ġ{ Ġinterf aze Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind MethodName Per Annotation ( inter f aze , Ġmethod )?. also Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġnot , Ġinspect Ġthe Ġsuperclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ= Ġclazz . super class Ġ?: Ġbreak ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(" java . lang . Object " Ġ!= Ġclazz . canonical Name ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġsearch Ġfor Ġa Ġ@ Name Ġannotation Ġgiven Ġby Ġuser Ġto Ġthis Ġclass , Ġits Ġinterfaces , Ġor Ġits Ġparent ĊĠĠĠ Ġprivate Ġfun Ġfind ClassName Per Annotation ( klass : ĠClass < *> ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclazz Ġ= Ġklass ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġcurrent Ġclass Ġa Ġ@ Name Ġannotation ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . getAnnotation ( Name :: class . java )?. also Ġ{ Ġreturn Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġany Ġof Ġthe Ġinterfaces Ġa Ġ@ Name Ġannotation ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . interfaces . forEach Ġ{ Ġinterf aze Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind ClassName Per Annotation ( inter f aze )?. also Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġnot , Ġinspect Ġthe Ġsuperclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ= Ġclazz . super class Ġ?: Ġbreak ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( Object :: class . java . name Ġ!= Ġclazz . canonical Name ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ