package Ġorg . hex works . cob alt . databinding . internal . property Ċ Ċ import Ġorg . hex works . cob alt . core . extensions . Predicate Ċ import Ġorg . hex works . cob alt . core . extensions . abbre vi ate Ċ import Ġorg . hex works . cob alt . core . internal . to Atom Ċ import Ġorg . hex works . cob alt . core . platform . factory . Identifier Factory Ċ import Ġorg . hex works . cob alt . databinding . api . C ob alt Ċ import Ġorg . hex works . cob alt . databinding . api . binding . Binding Ċ import Ġorg . hex works . cob alt . databinding . api . converter . Identity Converter Ċ import Ġorg . hex works . cob alt . databinding . api . converter . Is omorphic Converter Ċ import Ġorg . hex works . cob alt . databinding . api . converter . to Converter Ċ import Ġorg . hex works . cob alt . databinding . api . event . Observable ValueChanged Ċ import Ġorg . hex works . cob alt . databinding . internal . event . Property Scope Ċ import Ġorg . hex works . cob alt . databinding . api . property . Property Ċ import Ġorg . hex works . cob alt . databinding . api . value .* Ċ import Ġorg . hex works . cob alt . databinding . internal . binding . Bid irectional Binding Ċ import Ġorg . hex works . cob alt . databinding . internal . binding . Un id irectional Binding Ċ import Ġorg . hex works . cob alt . databinding . internal . exception . Circular Binding Exception Ċ import Ġorg . hex works . cob alt . events . api . Subscription Ċ import Ġorg . hex works . cob alt . events . api . subscribe To Ċ import Ġorg . hex works . cob alt . logging . api . LoggerFactory Ċ import Ġkotlin . jvm . Synchron ized Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠDefault Property < T Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalidator : ĠPredicate < T > Ġ= Ġ{ Ġtrue Ġ} Ċ ) Ġ: ĠInternal Property < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġid Ġ= ĠIdentifier Factory . random Identifier () ĊĠĠĠ Ġoverride Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this :: class ) ĊĠĠĠ Ġoverride Ġval Ġproperty Scope Ġ= ĠProperty Scope ( id ) ĊĠĠĠ Ġprivate Ġval Ġatom Ġ= Ġinitial Value . to Atom () ĊĠĠĠ Ġprivate Ġval Ġidentity Converter Ġ= ĠIdentity Converter < T >() ĊĊĠĠĠ Ġoverride Ġvar Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġatom . get () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Property ( id =${ id . abbre vi ate ()}, Ġvalue =$ value )" ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Value ( newValue : ĠT ): ĠValue Validation Result Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Trying Ġto Ġupdate Ġvalue Ġ$ value Ġto Ġnew Ġvalue Ġ$ newValue .") ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value ( newValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue Validation Successful ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠValue Validation FailedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue Validation Failed ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonChange ( fn : Ġ( Observable ValueChanged < T >) Ġ-> ĠUnit ): ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Sub scri bing Ġto Ġchanges Ġto Ġproperty : Ġ$ this .") ĊĠĠĠĠĠĠĠ Ġreturn ĠC ob alt . event bus . subscribe To < Observable ValueChanged < T >>( property Scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind ( other : ĠProperty < T >, Ġupdate When Bound : ĠBoolean ): ĠBinding < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbind ( other Ġ= Ġother , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate When Bound Ġ= Ġupdate When Bound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Ġ= Ġidentity Converter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< S Ġ: ĠAny > Ġbind ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother : ĠProperty < S >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate When Bound : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter : ĠIs omorphic Converter < S , ĠT > ĊĠĠĠ Ġ): ĠBinding < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Binding Ġproperty Ġ$ this Ġto Ġother Ġproperty Ġ$ other .") ĊĠĠĠĠĠĠĠ Ġcheck Self Binding ( other ) ĊĠĠĠĠĠĠĠ Ġother Ġas ? ĠInternal Property < S > Ġ?: Ġerror (" Can Ġonly Ġbind ĠProperties Ġwhich Ġimplement ĠInternal Property .") ĊĠĠĠĠĠĠĠ Ġif Ġ( update When Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value ( converter . convert ( other . value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠBid irectional Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġother , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Ġ= Ġconverter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate From ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobservable : ĠObservable Value < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate When Bound : ĠBoolean ĊĠĠĠ Ġ): ĠBinding < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġupdate From ( observable , Ġupdate When Bound ) Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< S Ġ: ĠAny > Ġupdate From ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobservable : ĠObservable Value < S >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate When Bound : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter : Ġ( S ) Ġ-> ĠT ): ĠBinding < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Starting Ġto Ġupdate Ġproperty Ġ$ this Ġfrom Ġ$ observable .") ĊĠĠĠĠĠĠĠ Ġcheck Self Binding ( observable ) ĊĠĠĠĠĠĠĠ Ġif Ġ( update When Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value ( converter ( observable . value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠUn id irectional Binding ( observable , Ġthis , Ġconverter . to Converter ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate With Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠObservable ValueChanged < Any >): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlogger . debug (" Trying Ġto Ġupdate Ġ$ this Ġusing Ġevent Ġ$ event Ġwith Ġnew Ġvalue Ġ$ newValue .") ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġtrick Ġenables Ġthe Ġwhole Ġsystem Ġnot Ġto Ġcrash Ġif Ġthere Ġis Ġa Ġcircular Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . trace . any Ġ{ Ġit . emitter Ġ== Ġthis Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCircular Binding Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Circular Ġbinding Ġdetected Ġwith Ġtrace Ġ${ event . trace . join ToString ()} Ġfor Ġproperty Ġ$ this . ĠLoop Ġwas Ġprevent ed .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatom . transform Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( validator ( newValue ). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValue Validation FailedException (" The Ġgiven Ġvalue Ġ'$ newValue ' Ġis Ġinvalid .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ!= ĠnewValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Old Ġvalue Ġ$ oldValue Ġof Ġ$ this Ġdiffers Ġfrom Ġnew Ġvalue Ġ$ newValue , Ġf iring Ġchange Ġevent .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ob alt . event bus . publish ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= ĠObservable ValueChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= ĠoldValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= ĠnewValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobservable Value Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Ġ= ĠlistOf ( event ) Ġ+ Ġevent . trace ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Scope Ġ= Ġproperty Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCircular Binding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Bound ĠProperty Ġwas Ġnot Ġupdated Ġdue Ġto Ġcircular Ġdependency ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Self Binding ( other : ĠObservable Value < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( this Ġ!== Ġother ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġbind Ġa Ġproperty Ġto Ġitself ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġwon 't Ġlead Ġto Ġa Ġdead lock Ġin Ġcase Ġwe Ġtry Ġto Ġset Ġthe Ġvalue Ġtwice Ġin Ġcase Ġof Ġa ĊĠĠĠ Ġ// Ġcircular Ġdependency , Ġbecause Ġwe Ġalready Ġhave Ġthe Ġmonitor . ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġupdate Current Value ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Updating Ġcurrent Ġvalue Ġof Ġproperty Ġ$ this Ġto Ġ$ value .") ĊĠĠĠĠĠĠĠ Ġatom . transform Ġ{ ĠoldValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( validator ( value ). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValue Validation FailedException (" The Ġgiven Ġvalue Ġ'$ value ' Ġis Ġinvalid .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Old Ġvalue Ġ$ oldValue Ġof Ġ$ this Ġdiffers Ġfrom Ġnew Ġvalue Ġ$ value , Ġf iring Ġchange Ġevent .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ob alt . event bus . publish ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= ĠObservable ValueChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= ĠoldValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobservable Value Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Ġ= Ġthis ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Scope Ġ= Ġproperty Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊ