UNPKG

bugcore

Version:

bugcore is a JavaScript library that provides a foundational architecture for object oriented JS

195 lines (154 loc) 6.25 kB
/* * Copyright (c) 2016 airbug Inc. http://airbug.com * * bugcore may be freely distributed under the MIT license. */ //------------------------------------------------------------------------------- // Annotations //------------------------------------------------------------------------------- //@Export('Observer') //@Require('ArgumentBug') //@Require('Class') //@Require('Obj') //@Require('ObjectPathMatcher') //@Require('TypeUtil') //------------------------------------------------------------------------------- // Context //------------------------------------------------------------------------------- require('bugpack').context("*", function(bugpack) { //------------------------------------------------------------------------------- // BugPack //------------------------------------------------------------------------------- var ArgumentBug = bugpack.require('ArgumentBug'); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); var ObjectPathMatcher = bugpack.require('ObjectPathMatcher'); var TypeUtil = bugpack.require('TypeUtil'); //------------------------------------------------------------------------------- // Declare Class //------------------------------------------------------------------------------- /** * @class * @extends {Obj} */ var Observer = Class.extend(Obj, { _name: "Observer", //------------------------------------------------------------------------------- // Constructor //------------------------------------------------------------------------------- /** * @constructs * @param {string} observationPathPattern * @param {function(Observation)} observerFunction * @param {Object=} observerContext */ _constructor: function(observationPathPattern, observerFunction, observerContext) { this._super(); if (!TypeUtil.isString(observationPathPattern)) { throw new ArgumentBug(ArgumentBug.ILLEGAL, "observationPathPattern", observationPathPattern, "parameter must be a string"); } if (!TypeUtil.isFunction(observerFunction)) { throw new ArgumentBug(ArgumentBug.ILLEGAL, "observerFunction", observerFunction, "parameter must be a function"); } //------------------------------------------------------------------------------- // Private Properties //------------------------------------------------------------------------------- /** * @private * @type {string} */ this.observationPathPattern = observationPathPattern; /** * @private * @type {ObjectPathMatcher} */ this.objectPathMatcher = new ObjectPathMatcher(this.observationPathPattern); /** * @private * @type {Object} */ this.observerContext = observerContext; /** * @private * @type {function(Observation)} */ this.observerFunction = observerFunction; }, //------------------------------------------------------------------------------- // Getters and Setters //------------------------------------------------------------------------------- /** * @return {ObjectPathMatcher} */ getObjectPathMatcher: function() { return this.objectPathMatcher; }, /** * @return {string} */ getObservationPathPattern: function() { return this.observationPathPattern; }, /** * @return {Object} */ getObserverContext: function() { return this.observerContext; }, /** * @return {function(Observation)} */ getObserverFunction: function() { return this.observerFunction; }, //------------------------------------------------------------------------------- // Obj Methods //------------------------------------------------------------------------------- /** * @override * @param {*} value * @return {boolean} */ equals: function(value) { if (Class.doesExtend(value, Observer)) { return (Obj.equals(value.getObserverFunction(), this.getObserverFunction()) && Obj.equals(value.getObserverContext(), this.getObserverContext()) && Obj.equals(value.getObservationPathPattern(), this.getObservationPathPattern())); } return false; }, /** * @override * @return {number} */ hashCode: function() { if (!this._hashCode) { this._hashCode = Obj.hashCode("[Observer]" + Obj.hashCode(this.getObserverFunction()) + "_" + Obj.hashCode(this.getObserverContext()) + "_" + Obj.hashCode(this.getObservationPathPattern())); } return this._hashCode; }, //------------------------------------------------------------------------------- // Public Methods //------------------------------------------------------------------------------- /** * @param {string} observationPath * @return {boolean} */ match: function(observationPath) { return this.objectPathMatcher.match(observationPath); }, /** * @param {Observation} observation */ observeObservation: function(observation) { this.getObserverFunction().call(this.getObserverContext(), observation); } }); //------------------------------------------------------------------------------- // Exports //------------------------------------------------------------------------------- bugpack.export('Observer', Observer); });