package Ġcom . h end ra angg rian . auto . prefs Ċ Ċ import Ġjava . lang . reflect . Constructor Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . util . Weak HashMap Ċ Ċ /** ĠCreate Ġan Ġinstance Ġof Ġ[ Writable Preferences ] Ġor Ġ[ Editable Preferences ] Ġand Ġbind Ġits Ġvalues Ġto ĠJVM Ġfields Ġwith Ġthis Ġobject . Ġ*/ Ċ object ĠP refs Ġ{ ĊĠĠĠ Ġprivate Ġvar ĠB IND INGS : ĠMutable Map < Class <* >, ĠConstructor < Preferences Saver >> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠLOGGER : ĠPreferences Logger ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġlogging Ġbehavior Ġusing Ġ[ Preferences Logger ] Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ param Ġlogger Ġcustom Ġor Ġpre - determin ed Ġlogger Ġ( e . g : Ġ[ Preferences Logger . System ]). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Logger ( logger : ĠPreferences Logger ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOGGER Ġ= Ġlogger ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġinfo ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOGGER ?. info ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġwarn ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOGGER ?. warn ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġfields Ġannotated Ġwith Ġ[ Bind Preference ] Ġwith Ġvalues Ġfrom Ġthis Ġpreferences . ĊĠĠĠĠ Ġ* Ġ@ param Ġsource Ġpreferences Ġto Ġextract . ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget Ġfields ' Ġowner . ĊĠĠĠĠ Ġ* Ġ@ return Ġsa ver Ġinstance Ġto Ġapply Ġchanges Ġmade Ġto Ġthe Ġfields . ĊĠĠĠĠ Ġ* Ġ@ throws ĠRuntimeException Ġwhen Ġconstructor Ġof Ġbinding Ġclass Ġcannot Ġbe Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbind ( source : ĠRead able Preferences , Ġtarget : ĠAny ): ĠPreferences Saver Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcls Ġ= Ġtarget . java Class ĊĠĠĠĠĠĠĠ Ġinfo (" Looking Ġup Ġbinding Ġfor Ġ${ cls . simple Name }") ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġfind Binding Constructor ( cls ) ĊĠĠĠĠĠĠĠ Ġif Ġ( constructor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo ("${ cls . simple Name } Ġbinding Ġnot Ġfound , Ġreturning Ġempty Ġsa ver .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPreferences Saver . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconstructor . newInstance ( source , Ġtarget ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unable Ġto Ġinvoke Ġ$ constructor ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInstanti ation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unable Ġto Ġinvoke Ġ$ constructor ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcause Ġ= Ġe . cause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRuntimeException Ġ-> Ġthrow Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Ġ-> Ġthrow Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unable Ġto Ġcreate Ġbinding Ġinstance .", Ġcause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġfind Binding Constructor ( cls : ĠClass < *> ): ĠConstructor < Preferences Saver >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( BIND INGS Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB IND INGS Ġ= ĠWeak HashMap () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġbinding Ġ= ĠB IND INGS ! ![ cls ] ĊĠĠĠĠĠĠĠ Ġif Ġ( binding Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo (" HIT : ĠCache Ġfound Ġin Ġbinding Ġweak Ġmap .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbinding ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcls Name Ġ= Ġcls . name ĊĠĠĠĠĠĠĠ Ġif Ġ( cls Name . startsWith (" android .") Ġ|| Ġcls Name . startsWith (" android x .") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcls Name . startsWith (" java .") Ġ|| Ġcls Name . startsWith (" kotlin .") ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo (" MIS S : ĠRe ached Ġframework Ġclass . ĠAb and oning Ġsearch .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Ġ= Ġcls . class Loader !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Class ( cls Name Ġ+ ĠBind Preference . SUFFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Constructor ( Readable Preferences :: class . java , Ġcls ) Ġas ĠConstructor < Preferences Saver > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo (" HIT : ĠLoaded Ġbinding Ġclass , Ġcaching Ġin Ġweak Ġmap .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper cls Ġ= Ġcls . super class !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarn (" Not Ġfound . ĠTrying Ġsuperclass Ġ${ super cls . name } Ġ... ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Ġ= Ġfind Binding Constructor ( super cls ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unable Ġto Ġfind Ġbinding Ġconstructor Ġfor Ġ$ cls Name ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠB IND INGS ! ![ cls ] Ġ= ĠcheckNotNull ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġfind Ġpreferences Ġbinding , Ġis Ġ` prefs - compiler ` Ġcorrectly Ġinstalled ?" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding ĊĠĠĠ Ġ} Ċ } Ċ