Watchables

Library defines watchable value abstraction, in form of three polymorphic
methods, where each one can be extended per type.

watchers

watchables/watchers module provides
method that has no default implementation and supposed to be defined per type
that wishes to implement this watchable abstraction:

var watchers =require("watchables/watchers")

functionType(){/* ... */}

watchers.define(Type,function(value){

// return array of registered observes for the given value,

// wthich is instance of `Type`.

})

watch

watchables/watch module provides
polymorphic method that comes with a default implementation. Given that it's
called with a value that implements watchers method and a observer function,
it will register given observer for the value unless it's already being
registered. Method can be defined for a specific type to better reflect
it's needs.

var watch =require("wathchables/watch")

watch(newType(),function(){

console.log("!!!!")

})

Method can also be extended with a type specific implementation.

var watch =require("wathchables/watch")

watch.define(Type,function(value,listener){

var listeners =value._listeners

if(typeof(listeners)==="undefined")

value._listeners= listener

elseif(typeof(listeners)==="function")

value._listeners=[value._listeners, listener]

else

listeners.push(listener)

})

unwatch

watchables/unwatch module provides
polymorphic method that comes with a default implementation. Given that it's
called with a value that implements watchers method and a observer function,
it will unregister given observer for the value, if it's registered.