--- /dev/null
+(function() {
+/*
+ * object.watch polyfill
+ *
+ * 2012-04-03
+ *
+ * By Eli Grey, http://eligrey.com
+ * Public Domain.
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+ */
+
+// object.watch
+if (!Object.prototype.watch) {
+ Object.defineProperty(Object.prototype, "watch", {
+ enumerable: false
+ , configurable: true
+ , writable: false
+ , value: function (prop, handler) {
+ var
+ oldval = this[prop]
+ , newval = oldval
+ , getter = function () {
+ return newval;
+ }
+ , setter = function (val) {
+ oldval = newval;
+ return newval = handler.call(this, prop, oldval, val);
+ }
+ ;
+
+ if (delete this[prop]) { // can't watch constants
+ Object.defineProperty(this, prop, {
+ get: getter
+ , set: setter
+ , enumerable: true
+ , configurable: true
+ });
+ }
+ }
+ });
+}
+
+// object.unwatch
+if (!Object.prototype.unwatch) {
+ Object.defineProperty(Object.prototype, "unwatch", {
+ enumerable: false
+ , configurable: true
+ , writable: false
+ , value: function (prop) {
+ var val = this[prop];
+ delete this[prop]; // remove accessors
+ this[prop] = val;
+ }
+ });
+}
+
+})();
+