package Ġcom . map k . k mapper Ċ Ċ import Ġcom . map k . annotations . K Getter Alias Ċ import Ġcom . map k . annotations . K Getter Ignore Ċ import Ġcom . map k . core . Argument Adaptor Ċ import Ġcom . map k . core . K Function For Call Ċ import Ġcom . map k . core . to K Constructor Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Concurrent Map Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Visibility Ċ import Ġkotlin . reflect . full . member Properties Ċ import Ġkotlin . reflect . jvm . java Getter Ċ Ċ class ĠK Mapper < T Ġ: ĠAny > Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġfunction : ĠK Function For Call < T >, ĊĠĠĠ Ġparameter Name Converter : Ġ(( String ) Ġ-> ĠString )? Ċ ) Ġ{ ĊĠĠĠ Ġconstructor ( function : ĠK Function < T >, Ġparameter Name Converter : Ġ(( String ) Ġ-> ĠString )? Ġ= Ġnull ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ ĠK Function For Call ( function , Ġparameter Name Converter ), ĊĠĠĠĠĠĠĠ Ġparameter Name Converter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġconstructor ( clazz : ĠK Class < T >, Ġparameter Name Converter : Ġ(( String ) Ġ-> ĠString )? Ġ= Ġnull ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġclazz . to K Constructor ( parameter Name Converter ), ĊĠĠĠĠĠĠĠ Ġparameter Name Converter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġparameter Map : ĠMap < String , ĠParameter For Map <* >> Ġ= Ġfunction . required Parameters . associate Ġ{ ĊĠĠĠĠĠĠĠ Ġit . name Ġto ĠParameter For Map ( it , Ġparameter Name Converter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġget Cache : ĠConcurrent Map < K Class <* >, ĠList < Argument Binder >> Ġ= ĠConcurrent HashMap () ĊĊĠĠĠ Ġprivate Ġfun Ġbind Arguments ( argument Adaptor : ĠArgument Adaptor , Ġsrc : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġsrc :: class ĊĊĠĠĠĠĠĠĠ Ġ// ĠãĤ Ń ãĥ£ ãĥĥ ãĤ·ãĥ¥ ãĥ Ĵ ãĥĥãĥĪ ãģĹãģŁ ãĤī çĻ»éĮ² ãģĹãģŁ åĨħå®¹ ãģ« æ² ¿ ãģ£ãģ¦ åıĸå¾Ĺ åĩ¦çĲĨ ãĤĴè¡Į ãģĨ ĊĠĠĠĠĠĠĠ Ġget Cache [ clazz ]?. let Ġ{ Ġgetters Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åıĸå¾Ĺ å¯¾è±¡ ãĥķãĤ£ ãĥ¼ãĥ« ãĥī ãģ¯ åįģ åĪĨ çµ ŀ ãĤĬ è¾¼ ãĤĵ ãģ§ ãģĦ ãĤĭ ãģ¨ èĢĥ ãģĪ ãĤī ãĤĮãĤĭ ãģŁãĤģ ãĢģ çµĤ äºĨ åĪ¤ å®ļ ãģ¯ è¡Į ãĤı ãģªãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetters . forEach Ġ{ Ġit . bind Argument ( src , Ġargument Adaptor ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtemp Binder ArrayList Ġ= ĠArrayList < Argument Binder >() ĊĊĠĠĠĠĠĠĠ Ġclazz . member Properties . forEach Ġouter @{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġproperty ãģĮ åħ¬ éĸĭ ãģķãĤĮ ãģ¦ãģĦ ãģªãģĦ åł´åĲĪãģ¯ åĩ¦çĲĨ ãĤĴè¡Į ãĤı ãģªãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . visibility Ġ!= ĠK Visibility . PUBLIC ) Ġreturn @ outer ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ ² ãĥĥ ãĤ¿ ãĥ¼ ãģĮ åıĸ ãĤĮ ãģªãģĦ åł´åĲĪãģ¯ åĩ¦çĲĨ ãĤĴè¡Į ãĤı ãģªãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava Getter : ĠMethod Ġ= Ġproperty . java Getter Ġ?: Ġreturn @ outer ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġalias : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠIgnore ãģ¨ Alias ãģĮ åĲĮ æĻĤ ãģ« æĮĩå®ļ ãģķãĤĮãĤĭ ãĤĪãģĨ ãģª ãĥĳ ãĤ¿ ãĥ¼ãĥ³ ãĤĴ èĢĥ æħ ® ãģĹãģ¦ alias ãģĮ åıĸ ãĤĮ ãģ¦ ãĤĤ break ãģĹãģ¦ãģĦ ãģªãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Getter . annotations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠK Getter Ignore ) Ġreturn @ outer Ġ// Ġignore ãģķãĤĮãģ¦ãģĦãĤĭ åł´åĲĪãģ¯ åĩ¦çĲĨ ãĤĴè¡Į ãĤı ãģªãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠK Getter Alias ) Ġalias Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Map [ alias Ġ?: Ġproperty . name ]?. let Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Getter . is Accessible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= ĠArgument Binder ( param , Ġjava Getter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinder . bind Argument ( src , Ġargument Adaptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Binder ArrayList . add ( binder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ Ń ãĥ£ ãĥĥ ãĤ·ãĥ¥ ãģ® æķ´ åĲĪ æĢ§ ãĤĴ ä¿Ŀ ãģ¤ ãģŁãĤģ ãĢģ ãģĵ ãģĵ ãģ§ãģ¯ çµĤ äºĨ åĪ¤ å®ļ ãĤĴè¡Į ãĤı ãģªãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget Cache . put If Absent ( clazz , Ġtemp Binder ArrayList ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Arguments ( argument Adaptor : ĠArgument Adaptor , Ġsrc : ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsrc . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Map [ key ]?. let Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åıĸå¾Ĺ ãģĹãģŁ åĨħå®¹ ãģĮ null ãģ§ ãģª ãģĳ ãĤĮãģ° éģ© åĪĩ ãģ« map ãģĻãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Adaptor . put If Absent ( param . name ) Ġ{ Ġvalue ?. let Ġ{ Ġparam . map Object ( value ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çµĤ äºĨ åĪ¤ å®ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument Adaptor . is Full Initialized ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Arguments ( argument Adaptor : ĠArgument Adaptor , Ġsrc Pair : ĠPair < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġsrc Pair . first . toString () ĊĊĠĠĠĠĠĠĠ Ġparameter Map [ key ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargument Adaptor . put If Absent ( key ) Ġ{ Ġsrc Pair . second ?. let Ġ{ Ġvalue Ġ-> Ġit . map Object ( value ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap ( src Map : ĠMap < String , ĠAny ?> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapt or : ĠArgument Adaptor Ġ= Ġfunction . get Argument Adaptor () ĊĠĠĠĠĠĠĠ Ġbind Arguments ( adapt or , Ġsrc Map ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction . call ( adapt or ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap ( src Pair : ĠPair < String , ĠAny ?> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapt or : ĠArgument Adaptor Ġ= Ġfunction . get Argument Adaptor () ĊĠĠĠĠĠĠĠ Ġbind Arguments ( adapt or , Ġsrc Pair ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction . call ( adapt or ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap ( src : ĠAny ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapt or : ĠArgument Adaptor Ġ= Ġfunction . get Argument Adaptor () ĊĠĠĠĠĠĠĠ Ġbind Arguments ( adapt or , Ġsrc ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction . call ( adapt or ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap ( var arg Ġargs : ĠAny ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapt or : ĠArgument Adaptor Ġ= Ġfunction . get Argument Adaptor () ĊĊĠĠĠĠĠĠĠ ĠlistOf (* args ). forEach Ġ{ Ġarg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġbind Arguments ( adapt or , Ġarg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġbind Arguments ( adapt or , Ġarg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbind Arguments ( adapt or , Ġarg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction . call ( adapt or ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠArgument Binder ( private Ġval Ġparam : ĠParameter For Map <* >, Ġprivate Ġval Ġjava Getter : ĠMethod ) Ġ{ ĊĠĠĠ Ġfun Ġbind Argument ( src : ĠAny , Ġadapt or : ĠArgument Adaptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapt or . put If Absent ( param . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Getter . invoke ( src )?. let Ġ{ Ġparam . map Object ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ