Last active
May 26, 2018 10:39
-
-
Save steveruizok/889a4a04d2091f32f1a848fd8bc8e32e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### | |
Define a property on a Layer that will emit a change event when that property changes. | |
Also, optionally give the property an initial value and a callback to run when the property changes. | |
@param {Layer} layer The layer on which to define the property. | |
@param {String} property The name of the property. | |
@param {Object} [value] The initial value of the property. | |
@param {Function} [callback] The callback to run when this property changes. Executed with two arguments: the property's new value and the Layer itself. | |
@param {Function} [validation] A function to validate the property's new value. | |
@param {String} [error] An error to throw if the validation function returned false. | |
@examples | |
Utils.define(myLayer, "toggled") | |
Utils.define(myLayer, "toggled", false) | |
Utils.define(myLayer, "toggled", false, myLayer.showToggled) | |
Utils.define(myLayer, "toggled", false, null, _.isBoolean, "Layer.toggled must be true or false.") | |
### | |
Utils.define = (layer, property, value, callback, validation, error) -> | |
validation ?= -> true | |
error ?= "Layer #{layer.id}'s property '#{property}' was given the wrong value type." | |
Object.defineProperty layer, | |
property, | |
get: -> return layer["_#{property}"] | |
set: (value) -> | |
if value? | |
if not validation(value) then throw error | |
return if value is layer["_#{property}"] | |
layer["_#{property}"] = value | |
layer.emit("change:#{property}", value, layer) | |
configurable: true | |
if callback? and typeof callback is 'function' | |
layer.on("change:#{property}", callback) | |
layer[property] = value |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment