package Ġme . sun ny day dev . mv vm kit . observable Ċ Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ import Ġtim ber . log . Tim ber Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġsun ny Ġon Ġ 2 8 . 0 4 . 2 0 1 8 . Ċ Ġ* Ġmail : Ġmail @ sun ny day dev . me Ċ Ġ*/ Ċ Ċ object ĠBind ables Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġreflect Fields Ġby Ġlazy Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName (" android x . databinding . library . base Adapters . BR ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ lazy Ġempty Map < String , ĠInt >() ĊĊĠĠĠĠĠĠĠ Ġscan Fields Map ( clazz ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmanual Fields : ĠMap < String , ĠInt >? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġfields Map : ĠMap < String , ĠInt > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmanual Fields Ġ?: Ġreflect Fields ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ Ġmanual Fields Ġ= Ġvalue Ġ} ĊĊĠĠĠ Ġfun Ġscan Fields Map ( clazz : ĠClass < *> ): ĠMap < String , ĠInt > Ġ= Ġclazz . fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . type Ġ== ĠInt :: class . java ObjectType Ġ|| Ġit . type Ġ== ĠInt :: class . java Primitive Type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit . name Ġto Ġit . get ( null ) Ġas ĠInt Ġ} Ċ Ċ } Ċ Ċ internal Ġclass ĠBind able Delegate < in ĠR : ĠNot ifiable Observable , ĠT : ĠAny ?> Ġ( ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġvalue : ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġid : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠonChange : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ): ĠRead Write Property < R , ĠT > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcached Checked Id : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠR , Ġproperty : ĠK Property < *> ): ĠT Ġ= Ġthis . value ĊĊĠĠĠ Ġoverride Ġoperator Ġfun ĠsetValue ( this Ref : ĠR , Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠ Ġval Ġchecked Id Ġ= Ġget Bind able Property Id ( property ) ĊĊĠĠĠĠĠĠĠ Ġthis Ref . notify PropertyChanged ( checked Id ) ĊĊĠĠĠĠĠĠĠ ĠonChange ?. invoke ( value ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bind able Property Id ( property : ĠK Property < *> ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġcached Checked Id ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cached Ġ!= Ġnull ) Ġcached ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfields Map Ġ= ĠBind ables . fields Map ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchecked Id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfields Map [ property . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfields Map [ property . fallback Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Unknown Ġbind able Ġproperty : Ġ$ property ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecked Id . also Ġ{ Ġcached Checked Id Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠK Property <* >. fallback Name : ĠString Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! name . startsWith (" is ")) Ġreturn Ġname ĊĠĠĠĠĠĠĠ Ġreturn Ġname [ 2 ]. toLowerCase () Ġ+ Ġname . substring ( 3 ) ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ fun Ġ< R : ĠNot ifiable Observable , ĠT : ĠAny ?> Ġbind able ( ĊĠĠĠĠĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠĠĠĠĠ ĠonChange : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ): ĠRead Write Property < R , ĠT > Ġ= Ġbind able ( initial Value , Ġnull , ĠonChange ) Ċ Ċ fun Ġ< R : ĠNot ifiable Observable , ĠT : ĠAny ?> Ġbind able ( ĊĠĠĠĠĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠĠĠĠĠ Ġid : ĠInt ?, ĊĠĠĠĠĠĠĠ ĠonChange : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ): ĠRead Write Property < R , ĠT > Ġ= ĠBind able Delegate ( initial Value , Ġid , ĠonChange )