ember-source 1.13.11 → 1.13.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08311bd1500dc782edc81d6406e52e5c2b225071
4
- data.tar.gz: 31aedbf9e7a7dba4436d7641c7c9c404c90b678f
3
+ metadata.gz: 26b5cf01082ab1d8865f82d6d9b57d59ffdc2e8c
4
+ data.tar.gz: d967409290000c2a95580a088dd61a8e8c12c4e2
5
5
  SHA512:
6
- metadata.gz: 78a511c622fed9f164fab8775135bc135398c0435108fdcf5adb90c86abc4c85f26d2f8daac7a5277388f483a7395c5fab799e6eff896e353bc9f2e96e0e3753
7
- data.tar.gz: 994aa347b79f99521dad0a4d5f27ee0448999c9f4cc0fa8b87f44e4a406f8993d7805511ad9ef060f18c00bb6aeec05ca2c0d99485399b74ab229ce8d1efe4f9
6
+ metadata.gz: 1a32727fa818713c1999e2bcb3fb57b9d7f33aa249aa32a7d3404355776e4259547329e54bb33b010f6149c651c3809f2c4552255b4de5e22d182d3385ea2bd7
7
+ data.tar.gz: 73d853e03db86d4b88bfb741ea8637224b62974ed78c16aa8dbb8a40304e02c569a01072162b6f3a56b8c5fc976f53dd85a2b9d41ceea79eac6028cfb6c16f51
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.13.11
1
+ 1.13.12
@@ -5,7 +5,7 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 1.13.11
8
+ * @version 1.13.12
9
9
  */
10
10
 
11
11
  (function() {
@@ -1871,1410 +1871,1410 @@ enifed("ember-metal/chains", ["exports", "ember-metal/core", "ember-metal/proper
1871
1871
  exports.ChainNode = ChainNode;
1872
1872
  });
1873
1873
  // warn, assert, etc;
1874
- enifed("ember-metal/computed", ["exports", "ember-metal/core", "ember-metal/property_set", "ember-metal/utils", "ember-metal/expand_properties", "ember-metal/error", "ember-metal/properties", "ember-metal/property_events", "ember-metal/dependent_keys"], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
1874
+ enifed("ember-metal/computed_macros", ["exports", "ember-metal/core", "ember-metal/property_get", "ember-metal/property_set", "ember-metal/computed", "ember-metal/is_empty", "ember-metal/is_none", "ember-metal/alias"], function (exports, _emberMetalCore, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalComputed, _emberMetalIs_empty, _emberMetalIs_none, _emberMetalAlias) {
1875
1875
  "use strict";
1876
1876
 
1877
+ exports.empty = empty;
1878
+ exports.notEmpty = notEmpty;
1879
+ exports.none = none;
1880
+ exports.not = not;
1881
+ exports.bool = bool;
1882
+ exports.match = match;
1883
+ exports.equal = equal;
1884
+ exports.gt = gt;
1885
+ exports.gte = gte;
1886
+ exports.lt = lt;
1887
+ exports.lte = lte;
1888
+ exports.oneWay = oneWay;
1889
+ exports.readOnly = readOnly;
1890
+ exports.defaultTo = defaultTo;
1891
+ exports.deprecatingAlias = deprecatingAlias;
1892
+
1877
1893
  /**
1878
1894
  @module ember
1879
1895
  @submodule ember-metal
1880
1896
  */
1881
1897
 
1882
- var metaFor = _emberMetalUtils.meta;
1898
+ function getProperties(self, propertyNames) {
1899
+ var ret = {};
1900
+ for (var i = 0; i < propertyNames.length; i++) {
1901
+ ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
1902
+ }
1903
+ return ret;
1904
+ }
1883
1905
 
1884
- function UNDEFINED() {}
1906
+ function generateComputedWithProperties(macro) {
1907
+ return function () {
1908
+ for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
1909
+ properties[_key] = arguments[_key];
1910
+ }
1885
1911
 
1886
- // ..........................................................
1887
- // COMPUTED PROPERTY
1888
- //
1912
+ var computedFunc = _emberMetalComputed.computed(function () {
1913
+ return macro.apply(this, [getProperties(this, properties)]);
1914
+ });
1915
+
1916
+ return computedFunc.property.apply(computedFunc, properties);
1917
+ };
1918
+ }
1889
1919
 
1890
1920
  /**
1891
- A computed property transforms an object's function into a property.
1892
-
1893
- By default the function backing the computed property will only be called
1894
- once and the result will be cached. You can specify various properties
1895
- that your computed property depends on. This will force the cached
1896
- result to be recomputed if the dependencies are modified.
1921
+ A computed property that returns true if the value of the dependent
1922
+ property is null, an empty string, empty array, or empty function.
1897
1923
 
1898
- In the following example we declare a computed property (by calling
1899
- `.property()` on the fullName function) and setup the property
1900
- dependencies (depending on firstName and lastName). The fullName function
1901
- will be called once (regardless of how many times it is accessed) as long
1902
- as its dependencies have not changed. Once firstName or lastName are updated
1903
- any future calls (or anything bound) to fullName will incorporate the new
1904
- values.
1924
+ Example
1905
1925
 
1906
1926
  ```javascript
1907
- var Person = Ember.Object.extend({
1908
- // these will be supplied by `create`
1909
- firstName: null,
1910
- lastName: null,
1911
-
1912
- fullName: function() {
1913
- var firstName = this.get('firstName');
1914
- var lastName = this.get('lastName');
1915
-
1916
- return firstName + ' ' + lastName;
1917
- }.property('firstName', 'lastName')
1927
+ var ToDoList = Ember.Object.extend({
1928
+ isDone: Ember.computed.empty('todos')
1918
1929
  });
1919
1930
 
1920
- var tom = Person.create({
1921
- firstName: 'Tom',
1922
- lastName: 'Dale'
1931
+ var todoList = ToDoList.create({
1932
+ todos: ['Unit Test', 'Documentation', 'Release']
1923
1933
  });
1924
1934
 
1925
- tom.get('fullName') // 'Tom Dale'
1935
+ todoList.get('isDone'); // false
1936
+ todoList.get('todos').clear();
1937
+ todoList.get('isDone'); // true
1926
1938
  ```
1927
1939
 
1928
- You can also define what Ember should do when setting a computed property.
1929
- If you try to set a computed property, it will be invoked with the key and
1930
- value you want to set it to. You can also accept the previous value as the
1931
- third parameter.
1932
-
1933
- ```javascript
1934
- var Person = Ember.Object.extend({
1935
- // these will be supplied by `create`
1936
- firstName: null,
1937
- lastName: null,
1938
-
1939
- fullName: function(key, value, oldValue) {
1940
- // getter
1941
- if (arguments.length === 1) {
1942
- var firstName = this.get('firstName');
1943
- var lastName = this.get('lastName');
1944
-
1945
- return firstName + ' ' + lastName;
1946
-
1947
- // setter
1948
- } else {
1949
- var name = value.split(' ');
1940
+ @since 1.6.0
1941
+ @method empty
1942
+ @for Ember.computed
1943
+ @param {String} dependentKey
1944
+ @return {Ember.ComputedProperty} computed property which negate
1945
+ the original value for property
1946
+ @public
1947
+ */
1948
+
1949
+ function empty(dependentKey) {
1950
+ return _emberMetalComputed.computed(dependentKey + '.length', function () {
1951
+ return _emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
1952
+ });
1953
+ }
1954
+
1955
+ /**
1956
+ A computed property that returns true if the value of the dependent
1957
+ property is NOT null, an empty string, empty array, or empty function.
1950
1958
 
1951
- this.set('firstName', name[0]);
1952
- this.set('lastName', name[1]);
1959
+ Example
1953
1960
 
1954
- return value;
1955
- }
1956
- }.property('firstName', 'lastName')
1961
+ ```javascript
1962
+ var Hamster = Ember.Object.extend({
1963
+ hasStuff: Ember.computed.notEmpty('backpack')
1957
1964
  });
1958
1965
 
1959
- var person = Person.create();
1966
+ var hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
1960
1967
 
1961
- person.set('fullName', 'Peter Wagenet');
1962
- person.get('firstName'); // 'Peter'
1963
- person.get('lastName'); // 'Wagenet'
1968
+ hamster.get('hasStuff'); // true
1969
+ hamster.get('backpack').clear(); // []
1970
+ hamster.get('hasStuff'); // false
1964
1971
  ```
1965
1972
 
1966
- @class ComputedProperty
1967
- @namespace Ember
1968
- @constructor
1973
+ @method notEmpty
1974
+ @for Ember.computed
1975
+ @param {String} dependentKey
1976
+ @return {Ember.ComputedProperty} computed property which returns true if
1977
+ original value for property is not empty.
1969
1978
  @public
1970
1979
  */
1971
- function ComputedProperty(config, opts) {
1972
- this.isDescriptor = true;
1973
- if (typeof config === "function") {
1974
- config.__ember_arity = config.length;
1975
- this._getter = config;
1976
- if (config.__ember_arity > 1) {
1977
- _emberMetalCore["default"].deprecate("Using the same function as getter and setter is deprecated.", false, {
1978
- url: "http://emberjs.com/deprecations/v1.x/#toc_deprecate-using-the-same-function-as-getter-and-setter-in-computed-properties"
1979
- });
1980
- this._setter = config;
1981
- }
1982
- } else {
1983
- this._getter = config.get;
1984
- this._setter = config.set;
1985
- if (this._setter && this._setter.__ember_arity === undefined) {
1986
- this._setter.__ember_arity = this._setter.length;
1987
- }
1988
- }
1989
-
1990
- this._dependentKeys = undefined;
1991
- this._suspended = undefined;
1992
- this._meta = undefined;
1993
1980
 
1994
- _emberMetalCore["default"].deprecate("Passing opts.cacheable to the CP constructor is deprecated. Invoke `volatile()` on the CP instead.", !opts || !opts.hasOwnProperty('cacheable'));
1995
- this._cacheable = opts && opts.cacheable !== undefined ? opts.cacheable : true; // TODO: Set always to `true` once this deprecation is gone.
1996
- this._dependentKeys = opts && opts.dependentKeys;
1997
- _emberMetalCore["default"].deprecate("Passing opts.readOnly to the CP constructor is deprecated. All CPs are writable by default. You can invoke `readOnly()` on the CP to change this.", !opts || !opts.hasOwnProperty('readOnly'));
1998
- this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false; // TODO: Set always to `false` once this deprecation is gone.
1981
+ function notEmpty(dependentKey) {
1982
+ return _emberMetalComputed.computed(dependentKey + '.length', function () {
1983
+ return !_emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
1984
+ });
1999
1985
  }
2000
1986
 
2001
- ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
2002
-
2003
- var ComputedPropertyPrototype = ComputedProperty.prototype;
2004
-
2005
1987
  /**
2006
- Properties are cacheable by default. Computed property will automatically
2007
- cache the return value of your function until one of the dependent keys changes.
1988
+ A computed property that returns true if the value of the dependent
1989
+ property is null or undefined. This avoids errors from JSLint complaining
1990
+ about use of ==, which can be technically confusing.
2008
1991
 
2009
- Call `volatile()` to set it into non-cached mode. When in this mode
2010
- the computed property will not automatically cache the return value.
1992
+ Example
2011
1993
 
2012
- However, if a property is properly observable, there is no reason to disable
2013
- caching.
1994
+ ```javascript
1995
+ var Hamster = Ember.Object.extend({
1996
+ isHungry: Ember.computed.none('food')
1997
+ });
2014
1998
 
2015
- @method cacheable
2016
- @param {Boolean} aFlag optional set to `false` to disable caching
2017
- @return {Ember.ComputedProperty} this
2018
- @chainable
2019
- @deprecated All computed properties are cacheble by default. Use `volatile()` instead to opt-out to caching.
2020
- @public
2021
- */
2022
- ComputedPropertyPrototype.cacheable = function (aFlag) {
2023
- _emberMetalCore["default"].deprecate('ComputedProperty.cacheable() is deprecated. All computed properties are cacheable by default.');
2024
- this._cacheable = aFlag !== false;
2025
- return this;
2026
- };
2027
-
2028
- /**
2029
- Call on a computed property to set it into non-cached mode. When in this
2030
- mode the computed property will not automatically cache the return value.
1999
+ var hamster = Hamster.create();
2031
2000
 
2032
- ```javascript
2033
- var outsideService = Ember.Object.extend({
2034
- value: function() {
2035
- return OutsideService.getValue();
2036
- }.property().volatile()
2037
- }).create();
2001
+ hamster.get('isHungry'); // true
2002
+ hamster.set('food', 'Banana');
2003
+ hamster.get('isHungry'); // false
2004
+ hamster.set('food', null);
2005
+ hamster.get('isHungry'); // true
2038
2006
  ```
2039
2007
 
2040
- @method volatile
2041
- @return {Ember.ComputedProperty} this
2042
- @chainable
2008
+ @method none
2009
+ @for Ember.computed
2010
+ @param {String} dependentKey
2011
+ @return {Ember.ComputedProperty} computed property which
2012
+ returns true if original value for property is null or undefined.
2043
2013
  @public
2044
2014
  */
2045
- ComputedPropertyPrototype["volatile"] = function () {
2046
- this._cacheable = false;
2047
- return this;
2048
- };
2015
+
2016
+ function none(dependentKey) {
2017
+ return _emberMetalComputed.computed(dependentKey, function () {
2018
+ return _emberMetalIs_none["default"](_emberMetalProperty_get.get(this, dependentKey));
2019
+ });
2020
+ }
2049
2021
 
2050
2022
  /**
2051
- Call on a computed property to set it into read-only mode. When in this
2052
- mode the computed property will throw an error when set.
2023
+ A computed property that returns the inverse boolean value
2024
+ of the original value for the dependent property.
2025
+
2026
+ Example
2053
2027
 
2054
2028
  ```javascript
2055
- var Person = Ember.Object.extend({
2056
- guid: function() {
2057
- return 'guid-guid-guid';
2058
- }.property().readOnly()
2029
+ var User = Ember.Object.extend({
2030
+ isAnonymous: Ember.computed.not('loggedIn')
2059
2031
  });
2060
2032
 
2061
- var person = Person.create();
2033
+ var user = User.create({loggedIn: false});
2062
2034
 
2063
- person.set('guid', 'new-guid'); // will throw an exception
2064
- ```
2035
+ user.get('isAnonymous'); // true
2036
+ user.set('loggedIn', true);
2037
+ user.get('isAnonymous'); // false
2038
+ ```
2065
2039
 
2066
- @method readOnly
2067
- @return {Ember.ComputedProperty} this
2068
- @chainable
2040
+ @method not
2041
+ @for Ember.computed
2042
+ @param {String} dependentKey
2043
+ @return {Ember.ComputedProperty} computed property which returns
2044
+ inverse of the original value for property
2069
2045
  @public
2070
2046
  */
2071
- ComputedPropertyPrototype.readOnly = function (readOnly) {
2072
- _emberMetalCore["default"].deprecate('Passing arguments to ComputedProperty.readOnly() is deprecated.', arguments.length === 0);
2073
- this._readOnly = readOnly === undefined || !!readOnly; // Force to true once this deprecation is gone
2074
- _emberMetalCore["default"].assert("Computed properties that define a setter using the new syntax cannot be read-only", !(this._readOnly && this._setter && this._setter !== this._getter));
2075
- return this;
2076
- };
2047
+
2048
+ function not(dependentKey) {
2049
+ return _emberMetalComputed.computed(dependentKey, function () {
2050
+ return !_emberMetalProperty_get.get(this, dependentKey);
2051
+ });
2052
+ }
2077
2053
 
2078
2054
  /**
2079
- Sets the dependent keys on this computed property. Pass any number of
2080
- arguments containing key paths that this computed property depends on.
2055
+ A computed property that converts the provided dependent property
2056
+ into a boolean value.
2081
2057
 
2082
2058
  ```javascript
2083
- var President = Ember.Object.extend({
2084
- fullName: computed(function() {
2085
- return this.get('firstName') + ' ' + this.get('lastName');
2086
-
2087
- // Tell Ember that this computed property depends on firstName
2088
- // and lastName
2089
- }).property('firstName', 'lastName')
2059
+ var Hamster = Ember.Object.extend({
2060
+ hasBananas: Ember.computed.bool('numBananas')
2090
2061
  });
2091
2062
 
2092
- var president = President.create({
2093
- firstName: 'Barack',
2094
- lastName: 'Obama'
2095
- });
2063
+ var hamster = Hamster.create();
2096
2064
 
2097
- president.get('fullName'); // 'Barack Obama'
2065
+ hamster.get('hasBananas'); // false
2066
+ hamster.set('numBananas', 0);
2067
+ hamster.get('hasBananas'); // false
2068
+ hamster.set('numBananas', 1);
2069
+ hamster.get('hasBananas'); // true
2070
+ hamster.set('numBananas', null);
2071
+ hamster.get('hasBananas'); // false
2098
2072
  ```
2099
2073
 
2100
- @method property
2101
- @param {String} path* zero or more property paths
2102
- @return {Ember.ComputedProperty} this
2103
- @chainable
2074
+ @method bool
2075
+ @for Ember.computed
2076
+ @param {String} dependentKey
2077
+ @return {Ember.ComputedProperty} computed property which converts
2078
+ to boolean the original value for property
2104
2079
  @public
2105
2080
  */
2106
- ComputedPropertyPrototype.property = function () {
2107
- var args;
2108
-
2109
- var addArg = function (property) {
2110
- _emberMetalCore["default"].deprecate("Depending on arrays using a dependent key ending with `@each` is deprecated. " + ("Please refactor from `Ember.computed('" + property + "', function() {});` to `Ember.computed('" + property.slice(0, -6) + ".[]', function() {})`."), property.slice(-5) !== '@each', { id: 'ember-metal.@each-dependent-key-leaf', until: '2.0.0' });
2111
2081
 
2112
- args.push(property);
2113
- };
2114
-
2115
- args = [];
2116
- for (var i = 0, l = arguments.length; i < l; i++) {
2117
- _emberMetalExpand_properties["default"](arguments[i], addArg);
2118
- }
2119
-
2120
- this._dependentKeys = args;
2121
- return this;
2122
- };
2082
+ function bool(dependentKey) {
2083
+ return _emberMetalComputed.computed(dependentKey, function () {
2084
+ return !!_emberMetalProperty_get.get(this, dependentKey);
2085
+ });
2086
+ }
2123
2087
 
2124
2088
  /**
2125
- In some cases, you may want to annotate computed properties with additional
2126
- metadata about how they function or what values they operate on. For example,
2127
- computed property functions may close over variables that are then no longer
2128
- available for introspection.
2089
+ A computed property which matches the original value for the
2090
+ dependent property against a given RegExp, returning `true`
2091
+ if they values matches the RegExp and `false` if it does not.
2129
2092
 
2130
- You can pass a hash of these values to a computed property like this:
2093
+ Example
2131
2094
 
2132
- ```
2133
- person: function() {
2134
- var personId = this.get('personId');
2135
- return App.Person.create({ id: personId });
2136
- }.property().meta({ type: App.Person })
2137
- ```
2095
+ ```javascript
2096
+ var User = Ember.Object.extend({
2097
+ hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
2098
+ });
2138
2099
 
2139
- The hash that you pass to the `meta()` function will be saved on the
2140
- computed property descriptor under the `_meta` key. Ember runtime
2141
- exposes a public API for retrieving these values from classes,
2142
- via the `metaForProperty()` function.
2100
+ var user = User.create({loggedIn: false});
2143
2101
 
2144
- @method meta
2145
- @param {Object} meta
2146
- @chainable
2102
+ user.get('hasValidEmail'); // false
2103
+ user.set('email', '');
2104
+ user.get('hasValidEmail'); // false
2105
+ user.set('email', 'ember_hamster@example.com');
2106
+ user.get('hasValidEmail'); // true
2107
+ ```
2108
+
2109
+ @method match
2110
+ @for Ember.computed
2111
+ @param {String} dependentKey
2112
+ @param {RegExp} regexp
2113
+ @return {Ember.ComputedProperty} computed property which match
2114
+ the original value for property against a given RegExp
2147
2115
  @public
2148
2116
  */
2149
2117
 
2150
- ComputedPropertyPrototype.meta = function (meta) {
2151
- if (arguments.length === 0) {
2152
- return this._meta || {};
2153
- } else {
2154
- this._meta = meta;
2155
- return this;
2156
- }
2157
- };
2158
-
2159
- /* impl descriptor API */
2160
- ComputedPropertyPrototype.didChange = function (obj, keyName) {
2161
- // _suspended is set via a CP.set to ensure we don't clear
2162
- // the cached value set by the setter
2163
- if (this._cacheable && this._suspended !== obj) {
2164
- var meta = metaFor(obj);
2165
- if (meta.cache && meta.cache[keyName] !== undefined) {
2166
- meta.cache[keyName] = undefined;
2167
- _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
2168
- }
2169
- }
2170
- };
2118
+ function match(dependentKey, regexp) {
2119
+ return _emberMetalComputed.computed(dependentKey, function () {
2120
+ var value = _emberMetalProperty_get.get(this, dependentKey);
2171
2121
 
2172
- function finishChains(chainNodes) {
2173
- for (var i = 0, l = chainNodes.length; i < l; i++) {
2174
- chainNodes[i].didChange(null);
2175
- }
2122
+ return typeof value === 'string' ? regexp.test(value) : false;
2123
+ });
2176
2124
  }
2177
2125
 
2178
2126
  /**
2179
- Access the value of the function backing the computed property.
2180
- If this property has already been cached, return the cached result.
2181
- Otherwise, call the function passing the property name as an argument.
2127
+ A computed property that returns true if the provided dependent property
2128
+ is equal to the given value.
2129
+
2130
+ Example
2182
2131
 
2183
2132
  ```javascript
2184
- var Person = Ember.Object.extend({
2185
- fullName: function(keyName) {
2186
- // the keyName parameter is 'fullName' in this case.
2187
- return this.get('firstName') + ' ' + this.get('lastName');
2188
- }.property('firstName', 'lastName')
2133
+ var Hamster = Ember.Object.extend({
2134
+ napTime: Ember.computed.equal('state', 'sleepy')
2189
2135
  });
2190
2136
 
2137
+ var hamster = Hamster.create();
2191
2138
 
2192
- var tom = Person.create({
2193
- firstName: 'Tom',
2194
- lastName: 'Dale'
2195
- });
2196
-
2197
- tom.get('fullName') // 'Tom Dale'
2139
+ hamster.get('napTime'); // false
2140
+ hamster.set('state', 'sleepy');
2141
+ hamster.get('napTime'); // true
2142
+ hamster.set('state', 'hungry');
2143
+ hamster.get('napTime'); // false
2198
2144
  ```
2199
2145
 
2200
- @method get
2201
- @param {String} keyName The key being accessed.
2202
- @return {Object} The return value of the function backing the CP.
2146
+ @method equal
2147
+ @for Ember.computed
2148
+ @param {String} dependentKey
2149
+ @param {String|Number|Object} value
2150
+ @return {Ember.ComputedProperty} computed property which returns true if
2151
+ the original value for property is equal to the given value.
2203
2152
  @public
2204
2153
  */
2205
- ComputedPropertyPrototype.get = function (obj, keyName) {
2206
- var ret, cache, meta, chainNodes;
2207
- if (this._cacheable) {
2208
- meta = metaFor(obj);
2209
- cache = meta.cache;
2210
-
2211
- var result = cache && cache[keyName];
2212
2154
 
2213
- if (result === UNDEFINED) {
2214
- return undefined;
2215
- } else if (result !== undefined) {
2216
- return result;
2217
- }
2218
-
2219
- ret = this._getter.call(obj, keyName);
2220
- cache = meta.cache;
2221
- if (!cache) {
2222
- cache = meta.cache = {};
2223
- }
2224
- if (ret === undefined) {
2225
- cache[keyName] = UNDEFINED;
2226
- } else {
2227
- cache[keyName] = ret;
2228
- }
2229
-
2230
- chainNodes = meta.chainWatchers && meta.chainWatchers[keyName];
2231
- if (chainNodes) {
2232
- finishChains(chainNodes);
2233
- }
2234
- _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
2235
- } else {
2236
- ret = this._getter.call(obj, keyName);
2237
- }
2238
- return ret;
2239
- };
2155
+ function equal(dependentKey, value) {
2156
+ return _emberMetalComputed.computed(dependentKey, function () {
2157
+ return _emberMetalProperty_get.get(this, dependentKey) === value;
2158
+ });
2159
+ }
2240
2160
 
2241
2161
  /**
2242
- Set the value of a computed property. If the function that backs your
2243
- computed property does not accept arguments then the default action for
2244
- setting would be to define the property on the current object, and set
2245
- the value of the property to the value being set.
2162
+ A computed property that returns true if the provided dependent property
2163
+ is greater than the provided value.
2246
2164
 
2247
- Generally speaking if you intend for your computed property to be set
2248
- your backing function should accept either two or three arguments.
2165
+ Example
2249
2166
 
2250
2167
  ```javascript
2251
- var Person = Ember.Object.extend({
2252
- // these will be supplied by `create`
2253
- firstName: null,
2254
- lastName: null,
2168
+ var Hamster = Ember.Object.extend({
2169
+ hasTooManyBananas: Ember.computed.gt('numBananas', 10)
2170
+ });
2255
2171
 
2256
- fullName: function(key, value, oldValue) {
2257
- // getter
2258
- if (arguments.length === 1) {
2259
- var firstName = this.get('firstName');
2260
- var lastName = this.get('lastName');
2172
+ var hamster = Hamster.create();
2261
2173
 
2262
- return firstName + ' ' + lastName;
2174
+ hamster.get('hasTooManyBananas'); // false
2175
+ hamster.set('numBananas', 3);
2176
+ hamster.get('hasTooManyBananas'); // false
2177
+ hamster.set('numBananas', 11);
2178
+ hamster.get('hasTooManyBananas'); // true
2179
+ ```
2263
2180
 
2264
- // setter
2265
- } else {
2266
- var name = value.split(' ');
2181
+ @method gt
2182
+ @for Ember.computed
2183
+ @param {String} dependentKey
2184
+ @param {Number} value
2185
+ @return {Ember.ComputedProperty} computed property which returns true if
2186
+ the original value for property is greater than given value.
2187
+ @public
2188
+ */
2189
+
2190
+ function gt(dependentKey, value) {
2191
+ return _emberMetalComputed.computed(dependentKey, function () {
2192
+ return _emberMetalProperty_get.get(this, dependentKey) > value;
2193
+ });
2194
+ }
2195
+
2196
+ /**
2197
+ A computed property that returns true if the provided dependent property
2198
+ is greater than or equal to the provided value.
2267
2199
 
2268
- this.set('firstName', name[0]);
2269
- this.set('lastName', name[1]);
2200
+ Example
2270
2201
 
2271
- return value;
2272
- }
2273
- }.property('firstName', 'lastName')
2202
+ ```javascript
2203
+ var Hamster = Ember.Object.extend({
2204
+ hasTooManyBananas: Ember.computed.gte('numBananas', 10)
2274
2205
  });
2275
2206
 
2276
- var person = Person.create();
2207
+ var hamster = Hamster.create();
2277
2208
 
2278
- person.set('fullName', 'Peter Wagenet');
2279
- person.get('firstName'); // 'Peter'
2280
- person.get('lastName'); // 'Wagenet'
2209
+ hamster.get('hasTooManyBananas'); // false
2210
+ hamster.set('numBananas', 3);
2211
+ hamster.get('hasTooManyBananas'); // false
2212
+ hamster.set('numBananas', 10);
2213
+ hamster.get('hasTooManyBananas'); // true
2281
2214
  ```
2282
2215
 
2283
- @method set
2284
- @param {String} keyName The key being accessed.
2285
- @param {Object} newValue The new value being assigned.
2286
- @param {String} oldValue The old value being replaced.
2287
- @return {Object} The return value of the function backing the CP.
2216
+ @method gte
2217
+ @for Ember.computed
2218
+ @param {String} dependentKey
2219
+ @param {Number} value
2220
+ @return {Ember.ComputedProperty} computed property which returns true if
2221
+ the original value for property is greater or equal then given value.
2288
2222
  @public
2289
2223
  */
2290
- ComputedPropertyPrototype.set = function computedPropertySetWithSuspend(obj, keyName, value) {
2291
- var oldSuspended = this._suspended;
2292
-
2293
- this._suspended = obj;
2294
-
2295
- try {
2296
- this._set(obj, keyName, value);
2297
- } finally {
2298
- this._suspended = oldSuspended;
2299
- }
2300
- };
2301
-
2302
- ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
2303
- var cacheable = this._cacheable;
2304
- var setter = this._setter;
2305
- var meta = metaFor(obj, cacheable);
2306
- var cache = meta.cache;
2307
- var hadCachedValue = false;
2308
-
2309
- var cachedValue, ret;
2310
-
2311
- if (this._readOnly) {
2312
- throw new _emberMetalError["default"]("Cannot set read-only property \"" + keyName + "\" on object: " + _emberMetalUtils.inspect(obj));
2313
- }
2314
-
2315
- if (cacheable && cache && cache[keyName] !== undefined) {
2316
- if (cache[keyName] !== UNDEFINED) {
2317
- cachedValue = cache[keyName];
2318
- }
2319
-
2320
- hadCachedValue = true;
2321
- }
2322
-
2323
- if (!setter) {
2324
- _emberMetalProperties.defineProperty(obj, keyName, null, cachedValue);
2325
- _emberMetalProperty_set.set(obj, keyName, value);
2326
- return;
2327
- } else if (setter.__ember_arity === 2) {
2328
- // Is there any way of deprecate this in a sensitive way?
2329
- // Maybe now that getters and setters are the prefered options we can....
2330
- ret = setter.call(obj, keyName, value);
2331
- } else {
2332
- ret = setter.call(obj, keyName, value, cachedValue);
2333
- }
2334
-
2335
- if (hadCachedValue && cachedValue === ret) {
2336
- return;
2337
- }
2338
-
2339
- var watched = meta.watching[keyName];
2340
- if (watched) {
2341
- _emberMetalProperty_events.propertyWillChange(obj, keyName);
2342
- }
2343
-
2344
- if (hadCachedValue) {
2345
- cache[keyName] = undefined;
2346
- }
2347
-
2348
- if (cacheable) {
2349
- if (!hadCachedValue) {
2350
- _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
2351
- }
2352
- if (!cache) {
2353
- cache = meta.cache = {};
2354
- }
2355
- if (ret === undefined) {
2356
- cache[keyName] = UNDEFINED;
2357
- } else {
2358
- cache[keyName] = ret;
2359
- }
2360
- }
2361
-
2362
- if (watched) {
2363
- _emberMetalProperty_events.propertyDidChange(obj, keyName);
2364
- }
2365
-
2366
- return ret;
2367
- };
2368
2224
 
2369
- /* called before property is overridden */
2370
- ComputedPropertyPrototype.teardown = function (obj, keyName) {
2371
- var meta = metaFor(obj);
2372
-
2373
- if (meta.cache) {
2374
- if (keyName in meta.cache) {
2375
- _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
2376
- }
2377
-
2378
- if (this._cacheable) {
2379
- delete meta.cache[keyName];
2380
- }
2381
- }
2382
-
2383
- return null; // no value to restore
2384
- };
2225
+ function gte(dependentKey, value) {
2226
+ return _emberMetalComputed.computed(dependentKey, function () {
2227
+ return _emberMetalProperty_get.get(this, dependentKey) >= value;
2228
+ });
2229
+ }
2385
2230
 
2386
2231
  /**
2387
- This helper returns a new property descriptor that wraps the passed
2388
- computed property function. You can use this helper to define properties
2389
- with mixins or via `Ember.defineProperty()`.
2390
-
2391
- The function you pass will be used to both get and set property values.
2392
- The function should accept two parameters, key and value. If value is not
2393
- undefined you should set the value first. In either case return the
2394
- current value of the property.
2395
-
2396
- A computed property defined in this way might look like this:
2232
+ A computed property that returns true if the provided dependent property
2233
+ is less than the provided value.
2397
2234
 
2398
- ```js
2399
- var Person = Ember.Object.extend({
2400
- firstName: 'Betty',
2401
- lastName: 'Jones',
2235
+ Example
2402
2236
 
2403
- fullName: Ember.computed('firstName', 'lastName', function(key, value) {
2404
- return this.get('firstName') + ' ' + this.get('lastName');
2405
- })
2237
+ ```javascript
2238
+ var Hamster = Ember.Object.extend({
2239
+ needsMoreBananas: Ember.computed.lt('numBananas', 3)
2406
2240
  });
2407
2241
 
2408
- var client = Person.create();
2409
-
2410
- client.get('fullName'); // 'Betty Jones'
2242
+ var hamster = Hamster.create();
2411
2243
 
2412
- client.set('lastName', 'Fuller');
2413
- client.get('fullName'); // 'Betty Fuller'
2244
+ hamster.get('needsMoreBananas'); // true
2245
+ hamster.set('numBananas', 3);
2246
+ hamster.get('needsMoreBananas'); // false
2247
+ hamster.set('numBananas', 2);
2248
+ hamster.get('needsMoreBananas'); // true
2414
2249
  ```
2415
2250
 
2416
- _Note: This is the preferred way to define computed properties when writing third-party
2417
- libraries that depend on or use Ember, since there is no guarantee that the user
2418
- will have prototype extensions enabled._
2251
+ @method lt
2252
+ @for Ember.computed
2253
+ @param {String} dependentKey
2254
+ @param {Number} value
2255
+ @return {Ember.ComputedProperty} computed property which returns true if
2256
+ the original value for property is less then given value.
2257
+ @public
2258
+ */
2259
+
2260
+ function lt(dependentKey, value) {
2261
+ return _emberMetalComputed.computed(dependentKey, function () {
2262
+ return _emberMetalProperty_get.get(this, dependentKey) < value;
2263
+ });
2264
+ }
2265
+
2266
+ /**
2267
+ A computed property that returns true if the provided dependent property
2268
+ is less than or equal to the provided value.
2419
2269
 
2420
- You might use this method if you disabled
2421
- [Prototype Extensions](http://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/).
2422
- The alternative syntax might look like this
2423
- (if prototype extensions are enabled, which is the default behavior):
2270
+ Example
2424
2271
 
2425
- ```js
2426
- fullName: function () {
2427
- return this.get('firstName') + ' ' + this.get('lastName');
2428
- }.property('firstName', 'lastName')
2272
+ ```javascript
2273
+ var Hamster = Ember.Object.extend({
2274
+ needsMoreBananas: Ember.computed.lte('numBananas', 3)
2275
+ });
2276
+
2277
+ var hamster = Hamster.create();
2278
+
2279
+ hamster.get('needsMoreBananas'); // true
2280
+ hamster.set('numBananas', 5);
2281
+ hamster.get('needsMoreBananas'); // false
2282
+ hamster.set('numBananas', 3);
2283
+ hamster.get('needsMoreBananas'); // true
2429
2284
  ```
2430
2285
 
2431
- @class computed
2432
- @namespace Ember
2433
- @constructor
2434
- @static
2435
- @param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.
2436
- @param {Function} func The computed property function.
2437
- @return {Ember.ComputedProperty} property descriptor instance
2286
+ @method lte
2287
+ @for Ember.computed
2288
+ @param {String} dependentKey
2289
+ @param {Number} value
2290
+ @return {Ember.ComputedProperty} computed property which returns true if
2291
+ the original value for property is less or equal than given value.
2438
2292
  @public
2439
2293
  */
2440
- function computed(func) {
2441
- var args;
2442
-
2443
- if (arguments.length > 1) {
2444
- args = [].slice.call(arguments);
2445
- func = args.pop();
2446
- }
2447
2294
 
2448
- var cp = new ComputedProperty(func);
2449
-
2450
- if (args) {
2451
- cp.property.apply(cp, args);
2452
- }
2453
-
2454
- return cp;
2295
+ function lte(dependentKey, value) {
2296
+ return _emberMetalComputed.computed(dependentKey, function () {
2297
+ return _emberMetalProperty_get.get(this, dependentKey) <= value;
2298
+ });
2455
2299
  }
2456
2300
 
2457
2301
  /**
2458
- Returns the cached value for a property, if one exists.
2459
- This can be useful for peeking at the value of a computed
2460
- property that is generated lazily, without accidentally causing
2461
- it to be created.
2302
+ A computed property that performs a logical `and` on the
2303
+ original values for the provided dependent properties.
2462
2304
 
2463
- @method cacheFor
2464
- @for Ember
2465
- @param {Object} obj the object whose property you want to check
2466
- @param {String} key the name of the property whose cached value you want
2467
- to return
2468
- @return {Object} the cached value
2305
+ Example
2306
+
2307
+ ```javascript
2308
+ var Hamster = Ember.Object.extend({
2309
+ readyForCamp: Ember.computed.and('hasTent', 'hasBackpack')
2310
+ });
2311
+
2312
+ var hamster = Hamster.create();
2313
+
2314
+ hamster.get('readyForCamp'); // false
2315
+ hamster.set('hasTent', true);
2316
+ hamster.get('readyForCamp'); // false
2317
+ hamster.set('hasBackpack', true);
2318
+ hamster.get('readyForCamp'); // true
2319
+ hamster.set('hasBackpack', 'Yes');
2320
+ hamster.get('readyForCamp'); // 'Yes'
2321
+ ```
2322
+
2323
+ @method and
2324
+ @for Ember.computed
2325
+ @param {String} dependentKey*
2326
+ @return {Ember.ComputedProperty} computed property which performs
2327
+ a logical `and` on the values of all the original values for properties.
2469
2328
  @public
2470
2329
  */
2471
- function cacheFor(obj, key) {
2472
- var meta = obj['__ember_meta__'];
2473
- var cache = meta && meta.cache;
2474
- var ret = cache && cache[key];
2475
-
2476
- if (ret === UNDEFINED) {
2477
- return undefined;
2478
- }
2479
- return ret;
2480
- }
2481
-
2482
- cacheFor.set = function (cache, key, value) {
2483
- if (value === undefined) {
2484
- cache[key] = UNDEFINED;
2485
- } else {
2486
- cache[key] = value;
2487
- }
2488
- };
2489
-
2490
- cacheFor.get = function (cache, key) {
2491
- var ret = cache[key];
2492
- if (ret === UNDEFINED) {
2493
- return undefined;
2330
+ var and = generateComputedWithProperties(function (properties) {
2331
+ var value;
2332
+ for (var key in properties) {
2333
+ value = properties[key];
2334
+ if (properties.hasOwnProperty(key) && !value) {
2335
+ return false;
2336
+ }
2494
2337
  }
2495
- return ret;
2496
- };
2497
-
2498
- cacheFor.remove = function (cache, key) {
2499
- cache[key] = undefined;
2500
- };
2501
-
2502
- exports.ComputedProperty = ComputedProperty;
2503
- exports.computed = computed;
2504
- exports.cacheFor = cacheFor;
2505
- });
2506
- enifed("ember-metal/computed_macros", ["exports", "ember-metal/core", "ember-metal/property_get", "ember-metal/property_set", "ember-metal/computed", "ember-metal/is_empty", "ember-metal/is_none", "ember-metal/alias"], function (exports, _emberMetalCore, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalComputed, _emberMetalIs_empty, _emberMetalIs_none, _emberMetalAlias) {
2507
- "use strict";
2508
-
2509
- exports.empty = empty;
2510
- exports.notEmpty = notEmpty;
2511
- exports.none = none;
2512
- exports.not = not;
2513
- exports.bool = bool;
2514
- exports.match = match;
2515
- exports.equal = equal;
2516
- exports.gt = gt;
2517
- exports.gte = gte;
2518
- exports.lt = lt;
2519
- exports.lte = lte;
2520
- exports.oneWay = oneWay;
2521
- exports.readOnly = readOnly;
2522
- exports.defaultTo = defaultTo;
2523
- exports.deprecatingAlias = deprecatingAlias;
2338
+ return value;
2339
+ });
2524
2340
 
2341
+ exports.and = and;
2525
2342
  /**
2526
- @module ember
2527
- @submodule ember-metal
2343
+ A computed property which performs a logical `or` on the
2344
+ original values for the provided dependent properties.
2345
+
2346
+ Example
2347
+
2348
+ ```javascript
2349
+ var Hamster = Ember.Object.extend({
2350
+ readyForRain: Ember.computed.or('hasJacket', 'hasUmbrella')
2351
+ });
2352
+
2353
+ var hamster = Hamster.create();
2354
+
2355
+ hamster.get('readyForRain'); // false
2356
+ hamster.set('hasUmbrella', true);
2357
+ hamster.get('readyForRain'); // true
2358
+ hamster.set('hasJacket', 'Yes');
2359
+ hamster.get('readyForRain'); // 'Yes'
2360
+ ```
2361
+
2362
+ @method or
2363
+ @for Ember.computed
2364
+ @param {String} dependentKey*
2365
+ @return {Ember.ComputedProperty} computed property which performs
2366
+ a logical `or` on the values of all the original values for properties.
2367
+ @public
2528
2368
  */
2529
-
2530
- function getProperties(self, propertyNames) {
2531
- var ret = {};
2532
- for (var i = 0; i < propertyNames.length; i++) {
2533
- ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
2534
- }
2535
- return ret;
2536
- }
2537
-
2538
- function generateComputedWithProperties(macro) {
2539
- return function () {
2540
- for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
2541
- properties[_key] = arguments[_key];
2369
+ var or = generateComputedWithProperties(function (properties) {
2370
+ for (var key in properties) {
2371
+ if (properties.hasOwnProperty(key) && properties[key]) {
2372
+ return properties[key];
2542
2373
  }
2374
+ }
2375
+ return false;
2376
+ });
2543
2377
 
2544
- var computedFunc = _emberMetalComputed.computed(function () {
2545
- return macro.apply(this, [getProperties(this, properties)]);
2546
- });
2547
-
2548
- return computedFunc.property.apply(computedFunc, properties);
2549
- };
2550
- }
2551
-
2378
+ exports.or = or;
2552
2379
  /**
2553
- A computed property that returns true if the value of the dependent
2554
- property is null, an empty string, empty array, or empty function.
2380
+ A computed property that returns the first truthy value
2381
+ from a list of dependent properties.
2555
2382
 
2556
2383
  Example
2557
2384
 
2558
2385
  ```javascript
2559
- var ToDoList = Ember.Object.extend({
2560
- isDone: Ember.computed.empty('todos')
2386
+ var Hamster = Ember.Object.extend({
2387
+ hasClothes: Ember.computed.any('hat', 'shirt')
2561
2388
  });
2562
2389
 
2563
- var todoList = ToDoList.create({
2564
- todos: ['Unit Test', 'Documentation', 'Release']
2565
- });
2390
+ var hamster = Hamster.create();
2566
2391
 
2567
- todoList.get('isDone'); // false
2568
- todoList.get('todos').clear();
2569
- todoList.get('isDone'); // true
2392
+ hamster.get('hasClothes'); // null
2393
+ hamster.set('shirt', 'Hawaiian Shirt');
2394
+ hamster.get('hasClothes'); // 'Hawaiian Shirt'
2570
2395
  ```
2571
2396
 
2572
- @since 1.6.0
2573
- @method empty
2397
+ @method any
2574
2398
  @for Ember.computed
2575
- @param {String} dependentKey
2576
- @return {Ember.ComputedProperty} computed property which negate
2577
- the original value for property
2399
+ @param {String} dependentKey*
2400
+ @return {Ember.ComputedProperty} computed property which returns
2401
+ the first truthy value of given list of properties.
2402
+ @deprecated Use `Ember.computed.or` instead.
2578
2403
  @public
2579
2404
  */
2405
+ var any = generateComputedWithProperties(function (properties) {
2406
+ _emberMetalCore["default"].deprecate('Usage of Ember.computed.any is deprecated, use `Ember.computed.or` instead.');
2407
+ for (var key in properties) {
2408
+ if (properties.hasOwnProperty(key) && properties[key]) {
2409
+ return properties[key];
2410
+ }
2411
+ }
2412
+ return null;
2413
+ });
2580
2414
 
2581
- function empty(dependentKey) {
2582
- return _emberMetalComputed.computed(dependentKey + '.length', function () {
2583
- return _emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
2584
- });
2585
- }
2586
-
2415
+ exports.any = any;
2587
2416
  /**
2588
- A computed property that returns true if the value of the dependent
2589
- property is NOT null, an empty string, empty array, or empty function.
2417
+ A computed property that returns the array of values
2418
+ for the provided dependent properties.
2590
2419
 
2591
2420
  Example
2592
2421
 
2593
2422
  ```javascript
2594
2423
  var Hamster = Ember.Object.extend({
2595
- hasStuff: Ember.computed.notEmpty('backpack')
2424
+ clothes: Ember.computed.collect('hat', 'shirt')
2596
2425
  });
2597
2426
 
2598
- var hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
2427
+ var hamster = Hamster.create();
2599
2428
 
2600
- hamster.get('hasStuff'); // true
2601
- hamster.get('backpack').clear(); // []
2602
- hamster.get('hasStuff'); // false
2429
+ hamster.get('clothes'); // [null, null]
2430
+ hamster.set('hat', 'Camp Hat');
2431
+ hamster.set('shirt', 'Camp Shirt');
2432
+ hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
2603
2433
  ```
2604
2434
 
2605
- @method notEmpty
2435
+ @method collect
2606
2436
  @for Ember.computed
2607
- @param {String} dependentKey
2608
- @return {Ember.ComputedProperty} computed property which returns true if
2609
- original value for property is not empty.
2437
+ @param {String} dependentKey*
2438
+ @return {Ember.ComputedProperty} computed property which maps
2439
+ values of all passed in properties to an array.
2610
2440
  @public
2611
2441
  */
2442
+ var collect = generateComputedWithProperties(function (properties) {
2443
+ var res = _emberMetalCore["default"].A();
2444
+ for (var key in properties) {
2445
+ if (properties.hasOwnProperty(key)) {
2446
+ if (_emberMetalIs_none["default"](properties[key])) {
2447
+ res.push(null);
2448
+ } else {
2449
+ res.push(properties[key]);
2450
+ }
2451
+ }
2452
+ }
2453
+ return res;
2454
+ });
2612
2455
 
2613
- function notEmpty(dependentKey) {
2614
- return _emberMetalComputed.computed(dependentKey + '.length', function () {
2615
- return !_emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
2616
- });
2617
- }
2618
-
2456
+ exports.collect = collect;
2619
2457
  /**
2620
- A computed property that returns true if the value of the dependent
2621
- property is null or undefined. This avoids errors from JSLint complaining
2622
- about use of ==, which can be technically confusing.
2623
-
2624
- Example
2458
+ Creates a new property that is an alias for another property
2459
+ on an object. Calls to `get` or `set` this property behave as
2460
+ though they were called on the original property.
2625
2461
 
2626
2462
  ```javascript
2627
- var Hamster = Ember.Object.extend({
2628
- isHungry: Ember.computed.none('food')
2463
+ var Person = Ember.Object.extend({
2464
+ name: 'Alex Matchneer',
2465
+ nomen: Ember.computed.alias('name')
2629
2466
  });
2630
2467
 
2631
- var hamster = Hamster.create();
2468
+ var alex = Person.create();
2632
2469
 
2633
- hamster.get('isHungry'); // true
2634
- hamster.set('food', 'Banana');
2635
- hamster.get('isHungry'); // false
2636
- hamster.set('food', null);
2637
- hamster.get('isHungry'); // true
2470
+ alex.get('nomen'); // 'Alex Matchneer'
2471
+ alex.get('name'); // 'Alex Matchneer'
2472
+
2473
+ alex.set('nomen', '@machty');
2474
+ alex.get('name'); // '@machty'
2638
2475
  ```
2639
2476
 
2640
- @method none
2477
+ @method alias
2641
2478
  @for Ember.computed
2642
2479
  @param {String} dependentKey
2643
- @return {Ember.ComputedProperty} computed property which
2644
- returns true if original value for property is null or undefined.
2480
+ @return {Ember.ComputedProperty} computed property which creates an
2481
+ alias to the original value for property.
2645
2482
  @public
2646
2483
  */
2647
2484
 
2648
- function none(dependentKey) {
2649
- return _emberMetalComputed.computed(dependentKey, function () {
2650
- return _emberMetalIs_none["default"](_emberMetalProperty_get.get(this, dependentKey));
2651
- });
2652
- }
2653
-
2654
2485
  /**
2655
- A computed property that returns the inverse boolean value
2656
- of the original value for the dependent property.
2486
+ Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
2487
+ data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
2488
+ not mutate the upstream property, rather causes the current property to
2489
+ become the value set. This causes the downstream property to permanently
2490
+ diverge from the upstream property.
2657
2491
 
2658
2492
  Example
2659
2493
 
2660
2494
  ```javascript
2661
2495
  var User = Ember.Object.extend({
2662
- isAnonymous: Ember.computed.not('loggedIn')
2496
+ firstName: null,
2497
+ lastName: null,
2498
+ nickName: Ember.computed.oneWay('firstName')
2663
2499
  });
2664
2500
 
2665
- var user = User.create({loggedIn: false});
2501
+ var teddy = User.create({
2502
+ firstName: 'Teddy',
2503
+ lastName: 'Zeenny'
2504
+ });
2666
2505
 
2667
- user.get('isAnonymous'); // true
2668
- user.set('loggedIn', true);
2669
- user.get('isAnonymous'); // false
2506
+ teddy.get('nickName'); // 'Teddy'
2507
+ teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'
2508
+ teddy.get('firstName'); // 'Teddy'
2670
2509
  ```
2671
2510
 
2672
- @method not
2511
+ @method oneWay
2673
2512
  @for Ember.computed
2674
2513
  @param {String} dependentKey
2675
- @return {Ember.ComputedProperty} computed property which returns
2676
- inverse of the original value for property
2514
+ @return {Ember.ComputedProperty} computed property which creates a
2515
+ one way computed property to the original value for property.
2677
2516
  @public
2678
2517
  */
2679
2518
 
2680
- function not(dependentKey) {
2681
- return _emberMetalComputed.computed(dependentKey, function () {
2682
- return !_emberMetalProperty_get.get(this, dependentKey);
2683
- });
2519
+ function oneWay(dependentKey) {
2520
+ return _emberMetalAlias["default"](dependentKey).oneWay();
2684
2521
  }
2685
2522
 
2686
2523
  /**
2687
- A computed property that converts the provided dependent property
2688
- into a boolean value.
2689
-
2690
- ```javascript
2691
- var Hamster = Ember.Object.extend({
2692
- hasBananas: Ember.computed.bool('numBananas')
2693
- });
2694
-
2695
- var hamster = Hamster.create();
2696
-
2697
- hamster.get('hasBananas'); // false
2698
- hamster.set('numBananas', 0);
2699
- hamster.get('hasBananas'); // false
2700
- hamster.set('numBananas', 1);
2701
- hamster.get('hasBananas'); // true
2702
- hamster.set('numBananas', null);
2703
- hamster.get('hasBananas'); // false
2704
- ```
2524
+ This is a more semantically meaningful alias of `computed.oneWay`,
2525
+ whose name is somewhat ambiguous as to which direction the data flows.
2705
2526
 
2706
- @method bool
2527
+ @method reads
2707
2528
  @for Ember.computed
2708
2529
  @param {String} dependentKey
2709
- @return {Ember.ComputedProperty} computed property which converts
2710
- to boolean the original value for property
2530
+ @return {Ember.ComputedProperty} computed property which creates a
2531
+ one way computed property to the original value for property.
2711
2532
  @public
2712
- */
2713
-
2714
- function bool(dependentKey) {
2715
- return _emberMetalComputed.computed(dependentKey, function () {
2716
- return !!_emberMetalProperty_get.get(this, dependentKey);
2717
- });
2718
- }
2533
+ */
2719
2534
 
2720
2535
  /**
2721
- A computed property which matches the original value for the
2722
- dependent property against a given RegExp, returning `true`
2723
- if they values matches the RegExp and `false` if it does not.
2536
+ Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
2537
+ a readOnly one way binding. Very often when using `computed.oneWay` one does
2538
+ not also want changes to propagate back up, as they will replace the value.
2539
+
2540
+ This prevents the reverse flow, and also throws an exception when it occurs.
2724
2541
 
2725
2542
  Example
2726
2543
 
2727
2544
  ```javascript
2728
2545
  var User = Ember.Object.extend({
2729
- hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
2546
+ firstName: null,
2547
+ lastName: null,
2548
+ nickName: Ember.computed.readOnly('firstName')
2730
2549
  });
2731
2550
 
2732
- var user = User.create({loggedIn: false});
2551
+ var teddy = User.create({
2552
+ firstName: 'Teddy',
2553
+ lastName: 'Zeenny'
2554
+ });
2733
2555
 
2734
- user.get('hasValidEmail'); // false
2735
- user.set('email', '');
2736
- user.get('hasValidEmail'); // false
2737
- user.set('email', 'ember_hamster@example.com');
2738
- user.get('hasValidEmail'); // true
2556
+ teddy.get('nickName'); // 'Teddy'
2557
+ teddy.set('nickName', 'TeddyBear'); // throws Exception
2558
+ // throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
2559
+ teddy.get('firstName'); // 'Teddy'
2739
2560
  ```
2740
2561
 
2741
- @method match
2562
+ @method readOnly
2742
2563
  @for Ember.computed
2743
2564
  @param {String} dependentKey
2744
- @param {RegExp} regexp
2745
- @return {Ember.ComputedProperty} computed property which match
2746
- the original value for property against a given RegExp
2565
+ @return {Ember.ComputedProperty} computed property which creates a
2566
+ one way computed property to the original value for property.
2567
+ @since 1.5.0
2747
2568
  @public
2748
2569
  */
2749
2570
 
2750
- function match(dependentKey, regexp) {
2751
- return _emberMetalComputed.computed(dependentKey, function () {
2752
- var value = _emberMetalProperty_get.get(this, dependentKey);
2753
-
2754
- return typeof value === 'string' ? regexp.test(value) : false;
2755
- });
2571
+ function readOnly(dependentKey) {
2572
+ return _emberMetalAlias["default"](dependentKey).readOnly();
2756
2573
  }
2757
2574
 
2758
2575
  /**
2759
- A computed property that returns true if the provided dependent property
2760
- is equal to the given value.
2576
+ A computed property that acts like a standard getter and setter,
2577
+ but returns the value at the provided `defaultPath` if the
2578
+ property itself has not been set to a value
2761
2579
 
2762
2580
  Example
2763
2581
 
2764
2582
  ```javascript
2765
2583
  var Hamster = Ember.Object.extend({
2766
- napTime: Ember.computed.equal('state', 'sleepy')
2584
+ wishList: Ember.computed.defaultTo('favoriteFood')
2767
2585
  });
2768
2586
 
2769
- var hamster = Hamster.create();
2587
+ var hamster = Hamster.create({ favoriteFood: 'Banana' });
2770
2588
 
2771
- hamster.get('napTime'); // false
2772
- hamster.set('state', 'sleepy');
2773
- hamster.get('napTime'); // true
2774
- hamster.set('state', 'hungry');
2775
- hamster.get('napTime'); // false
2589
+ hamster.get('wishList'); // 'Banana'
2590
+ hamster.set('wishList', 'More Unit Tests');
2591
+ hamster.get('wishList'); // 'More Unit Tests'
2592
+ hamster.get('favoriteFood'); // 'Banana'
2776
2593
  ```
2777
2594
 
2778
- @method equal
2595
+ @method defaultTo
2596
+ @for Ember.computed
2597
+ @param {String} defaultPath
2598
+ @return {Ember.ComputedProperty} computed property which acts like
2599
+ a standard getter and setter, but defaults to the value from `defaultPath`.
2600
+ @deprecated Use `Ember.computed.oneWay` or custom CP with default instead.
2601
+ @public
2602
+ */
2603
+
2604
+ function defaultTo(defaultPath) {
2605
+ return _emberMetalComputed.computed({
2606
+ get: function (key) {
2607
+ _emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
2608
+ return _emberMetalProperty_get.get(this, defaultPath);
2609
+ },
2610
+
2611
+ set: function (key, newValue, cachedValue) {
2612
+ _emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
2613
+ return newValue != null ? newValue : _emberMetalProperty_get.get(this, defaultPath);
2614
+ }
2615
+ });
2616
+ }
2617
+
2618
+ /**
2619
+ Creates a new property that is an alias for another property
2620
+ on an object. Calls to `get` or `set` this property behave as
2621
+ though they were called on the original property, but also
2622
+ print a deprecation warning.
2623
+
2624
+ @method deprecatingAlias
2779
2625
  @for Ember.computed
2780
2626
  @param {String} dependentKey
2781
- @param {String|Number|Object} value
2782
- @return {Ember.ComputedProperty} computed property which returns true if
2783
- the original value for property is equal to the given value.
2627
+ @return {Ember.ComputedProperty} computed property which creates an
2628
+ alias with a deprecation to the original value for property.
2629
+ @since 1.7.0
2784
2630
  @public
2785
2631
  */
2786
2632
 
2787
- function equal(dependentKey, value) {
2788
- return _emberMetalComputed.computed(dependentKey, function () {
2789
- return _emberMetalProperty_get.get(this, dependentKey) === value;
2633
+ function deprecatingAlias(dependentKey) {
2634
+ return _emberMetalComputed.computed(dependentKey, {
2635
+ get: function (key) {
2636
+ _emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
2637
+ return _emberMetalProperty_get.get(this, dependentKey);
2638
+ },
2639
+ set: function (key, value) {
2640
+ _emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
2641
+ _emberMetalProperty_set.set(this, dependentKey, value);
2642
+ return value;
2643
+ }
2790
2644
  });
2791
2645
  }
2646
+ });
2647
+ enifed("ember-metal/computed", ["exports", "ember-metal/core", "ember-metal/property_set", "ember-metal/utils", "ember-metal/expand_properties", "ember-metal/error", "ember-metal/properties", "ember-metal/property_events", "ember-metal/dependent_keys"], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
2648
+ "use strict";
2792
2649
 
2793
2650
  /**
2794
- A computed property that returns true if the provided dependent property
2795
- is greater than the provided value.
2651
+ @module ember
2652
+ @submodule ember-metal
2653
+ */
2654
+
2655
+ var metaFor = _emberMetalUtils.meta;
2656
+
2657
+ function UNDEFINED() {}
2658
+
2659
+ // ..........................................................
2660
+ // COMPUTED PROPERTY
2661
+ //
2662
+
2663
+ /**
2664
+ A computed property transforms an object's function into a property.
2796
2665
 
2797
- Example
2666
+ By default the function backing the computed property will only be called
2667
+ once and the result will be cached. You can specify various properties
2668
+ that your computed property depends on. This will force the cached
2669
+ result to be recomputed if the dependencies are modified.
2670
+
2671
+ In the following example we declare a computed property (by calling
2672
+ `.property()` on the fullName function) and setup the property
2673
+ dependencies (depending on firstName and lastName). The fullName function
2674
+ will be called once (regardless of how many times it is accessed) as long
2675
+ as its dependencies have not changed. Once firstName or lastName are updated
2676
+ any future calls (or anything bound) to fullName will incorporate the new
2677
+ values.
2798
2678
 
2799
2679
  ```javascript
2800
- var Hamster = Ember.Object.extend({
2801
- hasTooManyBananas: Ember.computed.gt('numBananas', 10)
2680
+ var Person = Ember.Object.extend({
2681
+ // these will be supplied by `create`
2682
+ firstName: null,
2683
+ lastName: null,
2684
+
2685
+ fullName: function() {
2686
+ var firstName = this.get('firstName');
2687
+ var lastName = this.get('lastName');
2688
+
2689
+ return firstName + ' ' + lastName;
2690
+ }.property('firstName', 'lastName')
2691
+ });
2692
+
2693
+ var tom = Person.create({
2694
+ firstName: 'Tom',
2695
+ lastName: 'Dale'
2802
2696
  });
2803
2697
 
2804
- var hamster = Hamster.create();
2805
-
2806
- hamster.get('hasTooManyBananas'); // false
2807
- hamster.set('numBananas', 3);
2808
- hamster.get('hasTooManyBananas'); // false
2809
- hamster.set('numBananas', 11);
2810
- hamster.get('hasTooManyBananas'); // true
2698
+ tom.get('fullName') // 'Tom Dale'
2811
2699
  ```
2812
2700
 
2813
- @method gt
2814
- @for Ember.computed
2815
- @param {String} dependentKey
2816
- @param {Number} value
2817
- @return {Ember.ComputedProperty} computed property which returns true if
2818
- the original value for property is greater than given value.
2819
- @public
2820
- */
2821
-
2822
- function gt(dependentKey, value) {
2823
- return _emberMetalComputed.computed(dependentKey, function () {
2824
- return _emberMetalProperty_get.get(this, dependentKey) > value;
2825
- });
2826
- }
2827
-
2828
- /**
2829
- A computed property that returns true if the provided dependent property
2830
- is greater than or equal to the provided value.
2831
-
2832
- Example
2701
+ You can also define what Ember should do when setting a computed property.
2702
+ If you try to set a computed property, it will be invoked with the key and
2703
+ value you want to set it to. You can also accept the previous value as the
2704
+ third parameter.
2833
2705
 
2834
2706
  ```javascript
2835
- var Hamster = Ember.Object.extend({
2836
- hasTooManyBananas: Ember.computed.gte('numBananas', 10)
2837
- });
2707
+ var Person = Ember.Object.extend({
2708
+ // these will be supplied by `create`
2709
+ firstName: null,
2710
+ lastName: null,
2838
2711
 
2839
- var hamster = Hamster.create();
2712
+ fullName: function(key, value, oldValue) {
2713
+ // getter
2714
+ if (arguments.length === 1) {
2715
+ var firstName = this.get('firstName');
2716
+ var lastName = this.get('lastName');
2840
2717
 
2841
- hamster.get('hasTooManyBananas'); // false
2842
- hamster.set('numBananas', 3);
2843
- hamster.get('hasTooManyBananas'); // false
2844
- hamster.set('numBananas', 10);
2845
- hamster.get('hasTooManyBananas'); // true
2846
- ```
2718
+ return firstName + ' ' + lastName;
2847
2719
 
2848
- @method gte
2849
- @for Ember.computed
2850
- @param {String} dependentKey
2851
- @param {Number} value
2852
- @return {Ember.ComputedProperty} computed property which returns true if
2853
- the original value for property is greater or equal then given value.
2854
- @public
2855
- */
2856
-
2857
- function gte(dependentKey, value) {
2858
- return _emberMetalComputed.computed(dependentKey, function () {
2859
- return _emberMetalProperty_get.get(this, dependentKey) >= value;
2860
- });
2861
- }
2862
-
2863
- /**
2864
- A computed property that returns true if the provided dependent property
2865
- is less than the provided value.
2720
+ // setter
2721
+ } else {
2722
+ var name = value.split(' ');
2866
2723
 
2867
- Example
2724
+ this.set('firstName', name[0]);
2725
+ this.set('lastName', name[1]);
2868
2726
 
2869
- ```javascript
2870
- var Hamster = Ember.Object.extend({
2871
- needsMoreBananas: Ember.computed.lt('numBananas', 3)
2727
+ return value;
2728
+ }
2729
+ }.property('firstName', 'lastName')
2872
2730
  });
2873
2731
 
2874
- var hamster = Hamster.create();
2732
+ var person = Person.create();
2875
2733
 
2876
- hamster.get('needsMoreBananas'); // true
2877
- hamster.set('numBananas', 3);
2878
- hamster.get('needsMoreBananas'); // false
2879
- hamster.set('numBananas', 2);
2880
- hamster.get('needsMoreBananas'); // true
2734
+ person.set('fullName', 'Peter Wagenet');
2735
+ person.get('firstName'); // 'Peter'
2736
+ person.get('lastName'); // 'Wagenet'
2881
2737
  ```
2882
2738
 
2883
- @method lt
2884
- @for Ember.computed
2885
- @param {String} dependentKey
2886
- @param {Number} value
2887
- @return {Ember.ComputedProperty} computed property which returns true if
2888
- the original value for property is less then given value.
2739
+ @class ComputedProperty
2740
+ @namespace Ember
2741
+ @constructor
2889
2742
  @public
2890
2743
  */
2744
+ function ComputedProperty(config, opts) {
2745
+ this.isDescriptor = true;
2746
+ if (typeof config === "function") {
2747
+ config.__ember_arity = config.length;
2748
+ this._getter = config;
2749
+ if (config.__ember_arity > 1) {
2750
+ _emberMetalCore["default"].deprecate("Using the same function as getter and setter is deprecated.", false, {
2751
+ url: "http://emberjs.com/deprecations/v1.x/#toc_deprecate-using-the-same-function-as-getter-and-setter-in-computed-properties"
2752
+ });
2753
+ this._setter = config;
2754
+ }
2755
+ } else {
2756
+ this._getter = config.get;
2757
+ this._setter = config.set;
2758
+ if (this._setter && this._setter.__ember_arity === undefined) {
2759
+ this._setter.__ember_arity = this._setter.length;
2760
+ }
2761
+ }
2891
2762
 
2892
- function lt(dependentKey, value) {
2893
- return _emberMetalComputed.computed(dependentKey, function () {
2894
- return _emberMetalProperty_get.get(this, dependentKey) < value;
2895
- });
2763
+ this._dependentKeys = undefined;
2764
+ this._suspended = undefined;
2765
+ this._meta = undefined;
2766
+
2767
+ _emberMetalCore["default"].deprecate("Passing opts.cacheable to the CP constructor is deprecated. Invoke `volatile()` on the CP instead.", !opts || !opts.hasOwnProperty('cacheable'));
2768
+ this._cacheable = opts && opts.cacheable !== undefined ? opts.cacheable : true; // TODO: Set always to `true` once this deprecation is gone.
2769
+ this._dependentKeys = opts && opts.dependentKeys;
2770
+ _emberMetalCore["default"].deprecate("Passing opts.readOnly to the CP constructor is deprecated. All CPs are writable by default. You can invoke `readOnly()` on the CP to change this.", !opts || !opts.hasOwnProperty('readOnly'));
2771
+ this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false; // TODO: Set always to `false` once this deprecation is gone.
2896
2772
  }
2897
2773
 
2774
+ ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
2775
+
2776
+ var ComputedPropertyPrototype = ComputedProperty.prototype;
2777
+
2898
2778
  /**
2899
- A computed property that returns true if the provided dependent property
2900
- is less than or equal to the provided value.
2901
-
2902
- Example
2903
-
2904
- ```javascript
2905
- var Hamster = Ember.Object.extend({
2906
- needsMoreBananas: Ember.computed.lte('numBananas', 3)
2907
- });
2779
+ Properties are cacheable by default. Computed property will automatically
2780
+ cache the return value of your function until one of the dependent keys changes.
2908
2781
 
2909
- var hamster = Hamster.create();
2782
+ Call `volatile()` to set it into non-cached mode. When in this mode
2783
+ the computed property will not automatically cache the return value.
2910
2784
 
2911
- hamster.get('needsMoreBananas'); // true
2912
- hamster.set('numBananas', 5);
2913
- hamster.get('needsMoreBananas'); // false
2914
- hamster.set('numBananas', 3);
2915
- hamster.get('needsMoreBananas'); // true
2916
- ```
2785
+ However, if a property is properly observable, there is no reason to disable
2786
+ caching.
2917
2787
 
2918
- @method lte
2919
- @for Ember.computed
2920
- @param {String} dependentKey
2921
- @param {Number} value
2922
- @return {Ember.ComputedProperty} computed property which returns true if
2923
- the original value for property is less or equal than given value.
2788
+ @method cacheable
2789
+ @param {Boolean} aFlag optional set to `false` to disable caching
2790
+ @return {Ember.ComputedProperty} this
2791
+ @chainable
2792
+ @deprecated All computed properties are cacheble by default. Use `volatile()` instead to opt-out to caching.
2924
2793
  @public
2925
2794
  */
2926
-
2927
- function lte(dependentKey, value) {
2928
- return _emberMetalComputed.computed(dependentKey, function () {
2929
- return _emberMetalProperty_get.get(this, dependentKey) <= value;
2930
- });
2931
- }
2795
+ ComputedPropertyPrototype.cacheable = function (aFlag) {
2796
+ _emberMetalCore["default"].deprecate('ComputedProperty.cacheable() is deprecated. All computed properties are cacheable by default.');
2797
+ this._cacheable = aFlag !== false;
2798
+ return this;
2799
+ };
2932
2800
 
2933
2801
  /**
2934
- A computed property that performs a logical `and` on the
2935
- original values for the provided dependent properties.
2936
-
2937
- Example
2802
+ Call on a computed property to set it into non-cached mode. When in this
2803
+ mode the computed property will not automatically cache the return value.
2938
2804
 
2939
2805
  ```javascript
2940
- var Hamster = Ember.Object.extend({
2941
- readyForCamp: Ember.computed.and('hasTent', 'hasBackpack')
2942
- });
2943
-
2944
- var hamster = Hamster.create();
2945
-
2946
- hamster.get('readyForCamp'); // false
2947
- hamster.set('hasTent', true);
2948
- hamster.get('readyForCamp'); // false
2949
- hamster.set('hasBackpack', true);
2950
- hamster.get('readyForCamp'); // true
2951
- hamster.set('hasBackpack', 'Yes');
2952
- hamster.get('readyForCamp'); // 'Yes'
2806
+ var outsideService = Ember.Object.extend({
2807
+ value: function() {
2808
+ return OutsideService.getValue();
2809
+ }.property().volatile()
2810
+ }).create();
2953
2811
  ```
2954
2812
 
2955
- @method and
2956
- @for Ember.computed
2957
- @param {String} dependentKey*
2958
- @return {Ember.ComputedProperty} computed property which performs
2959
- a logical `and` on the values of all the original values for properties.
2813
+ @method volatile
2814
+ @return {Ember.ComputedProperty} this
2815
+ @chainable
2960
2816
  @public
2961
2817
  */
2962
- var and = generateComputedWithProperties(function (properties) {
2963
- var value;
2964
- for (var key in properties) {
2965
- value = properties[key];
2966
- if (properties.hasOwnProperty(key) && !value) {
2967
- return false;
2968
- }
2969
- }
2970
- return value;
2971
- });
2818
+ ComputedPropertyPrototype["volatile"] = function () {
2819
+ this._cacheable = false;
2820
+ return this;
2821
+ };
2972
2822
 
2973
- exports.and = and;
2974
2823
  /**
2975
- A computed property which performs a logical `or` on the
2976
- original values for the provided dependent properties.
2977
-
2978
- Example
2824
+ Call on a computed property to set it into read-only mode. When in this
2825
+ mode the computed property will throw an error when set.
2979
2826
 
2980
2827
  ```javascript
2981
- var Hamster = Ember.Object.extend({
2982
- readyForRain: Ember.computed.or('hasJacket', 'hasUmbrella')
2828
+ var Person = Ember.Object.extend({
2829
+ guid: function() {
2830
+ return 'guid-guid-guid';
2831
+ }.property().readOnly()
2983
2832
  });
2984
2833
 
2985
- var hamster = Hamster.create();
2986
-
2987
- hamster.get('readyForRain'); // false
2988
- hamster.set('hasUmbrella', true);
2989
- hamster.get('readyForRain'); // true
2990
- hamster.set('hasJacket', 'Yes');
2991
- hamster.get('readyForRain'); // 'Yes'
2992
- ```
2834
+ var person = Person.create();
2993
2835
 
2994
- @method or
2995
- @for Ember.computed
2996
- @param {String} dependentKey*
2997
- @return {Ember.ComputedProperty} computed property which performs
2998
- a logical `or` on the values of all the original values for properties.
2836
+ person.set('guid', 'new-guid'); // will throw an exception
2837
+ ```
2838
+
2839
+ @method readOnly
2840
+ @return {Ember.ComputedProperty} this
2841
+ @chainable
2999
2842
  @public
3000
2843
  */
3001
- var or = generateComputedWithProperties(function (properties) {
3002
- for (var key in properties) {
3003
- if (properties.hasOwnProperty(key) && properties[key]) {
3004
- return properties[key];
3005
- }
3006
- }
3007
- return false;
3008
- });
2844
+ ComputedPropertyPrototype.readOnly = function (readOnly) {
2845
+ _emberMetalCore["default"].deprecate('Passing arguments to ComputedProperty.readOnly() is deprecated.', arguments.length === 0);
2846
+ this._readOnly = readOnly === undefined || !!readOnly; // Force to true once this deprecation is gone
2847
+ _emberMetalCore["default"].assert("Computed properties that define a setter using the new syntax cannot be read-only", !(this._readOnly && this._setter && this._setter !== this._getter));
2848
+ return this;
2849
+ };
3009
2850
 
3010
- exports.or = or;
3011
2851
  /**
3012
- A computed property that returns the first truthy value
3013
- from a list of dependent properties.
3014
-
3015
- Example
2852
+ Sets the dependent keys on this computed property. Pass any number of
2853
+ arguments containing key paths that this computed property depends on.
3016
2854
 
3017
2855
  ```javascript
3018
- var Hamster = Ember.Object.extend({
3019
- hasClothes: Ember.computed.any('hat', 'shirt')
2856
+ var President = Ember.Object.extend({
2857
+ fullName: computed(function() {
2858
+ return this.get('firstName') + ' ' + this.get('lastName');
2859
+
2860
+ // Tell Ember that this computed property depends on firstName
2861
+ // and lastName
2862
+ }).property('firstName', 'lastName')
3020
2863
  });
3021
2864
 
3022
- var hamster = Hamster.create();
2865
+ var president = President.create({
2866
+ firstName: 'Barack',
2867
+ lastName: 'Obama'
2868
+ });
3023
2869
 
3024
- hamster.get('hasClothes'); // null
3025
- hamster.set('shirt', 'Hawaiian Shirt');
3026
- hamster.get('hasClothes'); // 'Hawaiian Shirt'
2870
+ president.get('fullName'); // 'Barack Obama'
3027
2871
  ```
3028
2872
 
3029
- @method any
3030
- @for Ember.computed
3031
- @param {String} dependentKey*
3032
- @return {Ember.ComputedProperty} computed property which returns
3033
- the first truthy value of given list of properties.
3034
- @deprecated Use `Ember.computed.or` instead.
2873
+ @method property
2874
+ @param {String} path* zero or more property paths
2875
+ @return {Ember.ComputedProperty} this
2876
+ @chainable
3035
2877
  @public
3036
2878
  */
3037
- var any = generateComputedWithProperties(function (properties) {
3038
- _emberMetalCore["default"].deprecate('Usage of Ember.computed.any is deprecated, use `Ember.computed.or` instead.');
3039
- for (var key in properties) {
3040
- if (properties.hasOwnProperty(key) && properties[key]) {
3041
- return properties[key];
3042
- }
2879
+ ComputedPropertyPrototype.property = function () {
2880
+ var args;
2881
+
2882
+ var addArg = function (property) {
2883
+ _emberMetalCore["default"].deprecate("Depending on arrays using a dependent key ending with `@each` is deprecated. " + ("Please refactor from `Ember.computed('" + property + "', function() {});` to `Ember.computed('" + property.slice(0, -6) + ".[]', function() {})`."), property.slice(-5) !== '@each', { id: 'ember-metal.@each-dependent-key-leaf', until: '2.0.0' });
2884
+
2885
+ args.push(property);
2886
+ };
2887
+
2888
+ args = [];
2889
+ for (var i = 0, l = arguments.length; i < l; i++) {
2890
+ _emberMetalExpand_properties["default"](arguments[i], addArg);
3043
2891
  }
3044
- return null;
3045
- });
3046
2892
 
3047
- exports.any = any;
2893
+ this._dependentKeys = args;
2894
+ return this;
2895
+ };
2896
+
3048
2897
  /**
3049
- A computed property that returns the array of values
3050
- for the provided dependent properties.
3051
-
3052
- Example
3053
-
3054
- ```javascript
3055
- var Hamster = Ember.Object.extend({
3056
- clothes: Ember.computed.collect('hat', 'shirt')
3057
- });
2898
+ In some cases, you may want to annotate computed properties with additional
2899
+ metadata about how they function or what values they operate on. For example,
2900
+ computed property functions may close over variables that are then no longer
2901
+ available for introspection.
3058
2902
 
3059
- var hamster = Hamster.create();
2903
+ You can pass a hash of these values to a computed property like this:
3060
2904
 
3061
- hamster.get('clothes'); // [null, null]
3062
- hamster.set('hat', 'Camp Hat');
3063
- hamster.set('shirt', 'Camp Shirt');
3064
- hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
2905
+ ```
2906
+ person: function() {
2907
+ var personId = this.get('personId');
2908
+ return App.Person.create({ id: personId });
2909
+ }.property().meta({ type: App.Person })
3065
2910
  ```
3066
2911
 
3067
- @method collect
3068
- @for Ember.computed
3069
- @param {String} dependentKey*
3070
- @return {Ember.ComputedProperty} computed property which maps
3071
- values of all passed in properties to an array.
2912
+ The hash that you pass to the `meta()` function will be saved on the
2913
+ computed property descriptor under the `_meta` key. Ember runtime
2914
+ exposes a public API for retrieving these values from classes,
2915
+ via the `metaForProperty()` function.
2916
+
2917
+ @method meta
2918
+ @param {Object} meta
2919
+ @chainable
3072
2920
  @public
3073
2921
  */
3074
- var collect = generateComputedWithProperties(function (properties) {
3075
- var res = _emberMetalCore["default"].A();
3076
- for (var key in properties) {
3077
- if (properties.hasOwnProperty(key)) {
3078
- if (_emberMetalIs_none["default"](properties[key])) {
3079
- res.push(null);
3080
- } else {
3081
- res.push(properties[key]);
3082
- }
2922
+
2923
+ ComputedPropertyPrototype.meta = function (meta) {
2924
+ if (arguments.length === 0) {
2925
+ return this._meta || {};
2926
+ } else {
2927
+ this._meta = meta;
2928
+ return this;
2929
+ }
2930
+ };
2931
+
2932
+ /* impl descriptor API */
2933
+ ComputedPropertyPrototype.didChange = function (obj, keyName) {
2934
+ // _suspended is set via a CP.set to ensure we don't clear
2935
+ // the cached value set by the setter
2936
+ if (this._cacheable && this._suspended !== obj) {
2937
+ var meta = metaFor(obj);
2938
+ if (meta.cache && meta.cache[keyName] !== undefined) {
2939
+ meta.cache[keyName] = undefined;
2940
+ _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
3083
2941
  }
3084
2942
  }
3085
- return res;
3086
- });
2943
+ };
2944
+
2945
+ function finishChains(chainNodes) {
2946
+ for (var i = 0, l = chainNodes.length; i < l; i++) {
2947
+ chainNodes[i].didChange(null);
2948
+ }
2949
+ }
3087
2950
 
3088
- exports.collect = collect;
3089
2951
  /**
3090
- Creates a new property that is an alias for another property
3091
- on an object. Calls to `get` or `set` this property behave as
3092
- though they were called on the original property.
2952
+ Access the value of the function backing the computed property.
2953
+ If this property has already been cached, return the cached result.
2954
+ Otherwise, call the function passing the property name as an argument.
3093
2955
 
3094
2956
  ```javascript
3095
2957
  var Person = Ember.Object.extend({
3096
- name: 'Alex Matchneer',
3097
- nomen: Ember.computed.alias('name')
2958
+ fullName: function(keyName) {
2959
+ // the keyName parameter is 'fullName' in this case.
2960
+ return this.get('firstName') + ' ' + this.get('lastName');
2961
+ }.property('firstName', 'lastName')
3098
2962
  });
3099
2963
 
3100
- var alex = Person.create();
3101
2964
 
3102
- alex.get('nomen'); // 'Alex Matchneer'
3103
- alex.get('name'); // 'Alex Matchneer'
2965
+ var tom = Person.create({
2966
+ firstName: 'Tom',
2967
+ lastName: 'Dale'
2968
+ });
3104
2969
 
3105
- alex.set('nomen', '@machty');
3106
- alex.get('name'); // '@machty'
2970
+ tom.get('fullName') // 'Tom Dale'
3107
2971
  ```
3108
2972
 
3109
- @method alias
3110
- @for Ember.computed
3111
- @param {String} dependentKey
3112
- @return {Ember.ComputedProperty} computed property which creates an
3113
- alias to the original value for property.
2973
+ @method get
2974
+ @param {String} keyName The key being accessed.
2975
+ @return {Object} The return value of the function backing the CP.
3114
2976
  @public
3115
2977
  */
2978
+ ComputedPropertyPrototype.get = function (obj, keyName) {
2979
+ var ret, cache, meta, chainNodes;
2980
+ if (this._cacheable) {
2981
+ meta = metaFor(obj);
2982
+ cache = meta.cache;
2983
+
2984
+ var result = cache && cache[keyName];
2985
+
2986
+ if (result === UNDEFINED) {
2987
+ return undefined;
2988
+ } else if (result !== undefined) {
2989
+ return result;
2990
+ }
2991
+
2992
+ ret = this._getter.call(obj, keyName);
2993
+ cache = meta.cache;
2994
+ if (!cache) {
2995
+ cache = meta.cache = {};
2996
+ }
2997
+ if (ret === undefined) {
2998
+ cache[keyName] = UNDEFINED;
2999
+ } else {
3000
+ cache[keyName] = ret;
3001
+ }
3002
+
3003
+ chainNodes = meta.chainWatchers && meta.chainWatchers[keyName];
3004
+ if (chainNodes) {
3005
+ finishChains(chainNodes);
3006
+ }
3007
+ _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
3008
+ } else {
3009
+ ret = this._getter.call(obj, keyName);
3010
+ }
3011
+ return ret;
3012
+ };
3116
3013
 
3117
3014
  /**
3118
- Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
3119
- data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
3120
- not mutate the upstream property, rather causes the current property to
3121
- become the value set. This causes the downstream property to permanently
3122
- diverge from the upstream property.
3015
+ Set the value of a computed property. If the function that backs your
3016
+ computed property does not accept arguments then the default action for
3017
+ setting would be to define the property on the current object, and set
3018
+ the value of the property to the value being set.
3123
3019
 
3124
- Example
3020
+ Generally speaking if you intend for your computed property to be set
3021
+ your backing function should accept either two or three arguments.
3125
3022
 
3126
3023
  ```javascript
3127
- var User = Ember.Object.extend({
3024
+ var Person = Ember.Object.extend({
3025
+ // these will be supplied by `create`
3128
3026
  firstName: null,
3129
3027
  lastName: null,
3130
- nickName: Ember.computed.oneWay('firstName')
3131
- });
3132
3028
 
3133
- var teddy = User.create({
3134
- firstName: 'Teddy',
3135
- lastName: 'Zeenny'
3029
+ fullName: function(key, value, oldValue) {
3030
+ // getter
3031
+ if (arguments.length === 1) {
3032
+ var firstName = this.get('firstName');
3033
+ var lastName = this.get('lastName');
3034
+
3035
+ return firstName + ' ' + lastName;
3036
+
3037
+ // setter
3038
+ } else {
3039
+ var name = value.split(' ');
3040
+
3041
+ this.set('firstName', name[0]);
3042
+ this.set('lastName', name[1]);
3043
+
3044
+ return value;
3045
+ }
3046
+ }.property('firstName', 'lastName')
3136
3047
  });
3137
3048
 
3138
- teddy.get('nickName'); // 'Teddy'
3139
- teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'
3140
- teddy.get('firstName'); // 'Teddy'
3049
+ var person = Person.create();
3050
+
3051
+ person.set('fullName', 'Peter Wagenet');
3052
+ person.get('firstName'); // 'Peter'
3053
+ person.get('lastName'); // 'Wagenet'
3141
3054
  ```
3142
3055
 
3143
- @method oneWay
3144
- @for Ember.computed
3145
- @param {String} dependentKey
3146
- @return {Ember.ComputedProperty} computed property which creates a
3147
- one way computed property to the original value for property.
3056
+ @method set
3057
+ @param {String} keyName The key being accessed.
3058
+ @param {Object} newValue The new value being assigned.
3059
+ @param {String} oldValue The old value being replaced.
3060
+ @return {Object} The return value of the function backing the CP.
3148
3061
  @public
3149
3062
  */
3063
+ ComputedPropertyPrototype.set = function computedPropertySetWithSuspend(obj, keyName, value) {
3064
+ var oldSuspended = this._suspended;
3150
3065
 
3151
- function oneWay(dependentKey) {
3152
- return _emberMetalAlias["default"](dependentKey).oneWay();
3153
- }
3066
+ this._suspended = obj;
3154
3067
 
3155
- /**
3156
- This is a more semantically meaningful alias of `computed.oneWay`,
3157
- whose name is somewhat ambiguous as to which direction the data flows.
3158
-
3159
- @method reads
3160
- @for Ember.computed
3161
- @param {String} dependentKey
3162
- @return {Ember.ComputedProperty} computed property which creates a
3163
- one way computed property to the original value for property.
3164
- @public
3165
- */
3068
+ try {
3069
+ this._set(obj, keyName, value);
3070
+ } finally {
3071
+ this._suspended = oldSuspended;
3072
+ }
3073
+ };
3074
+
3075
+ ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
3076
+ var cacheable = this._cacheable;
3077
+ var setter = this._setter;
3078
+ var meta = metaFor(obj, cacheable);
3079
+ var cache = meta.cache;
3080
+ var hadCachedValue = false;
3081
+
3082
+ var cachedValue, ret;
3083
+
3084
+ if (this._readOnly) {
3085
+ throw new _emberMetalError["default"]("Cannot set read-only property \"" + keyName + "\" on object: " + _emberMetalUtils.inspect(obj));
3086
+ }
3087
+
3088
+ if (cacheable && cache && cache[keyName] !== undefined) {
3089
+ if (cache[keyName] !== UNDEFINED) {
3090
+ cachedValue = cache[keyName];
3091
+ }
3092
+
3093
+ hadCachedValue = true;
3094
+ }
3095
+
3096
+ if (!setter) {
3097
+ _emberMetalProperties.defineProperty(obj, keyName, null, cachedValue);
3098
+ _emberMetalProperty_set.set(obj, keyName, value);
3099
+ return;
3100
+ } else if (setter.__ember_arity === 2) {
3101
+ // Is there any way of deprecate this in a sensitive way?
3102
+ // Maybe now that getters and setters are the prefered options we can....
3103
+ ret = setter.call(obj, keyName, value);
3104
+ } else {
3105
+ ret = setter.call(obj, keyName, value, cachedValue);
3106
+ }
3107
+
3108
+ if (hadCachedValue && cachedValue === ret) {
3109
+ return;
3110
+ }
3111
+
3112
+ var watched = meta.watching[keyName];
3113
+ if (watched) {
3114
+ _emberMetalProperty_events.propertyWillChange(obj, keyName);
3115
+ }
3116
+
3117
+ if (hadCachedValue) {
3118
+ cache[keyName] = undefined;
3119
+ }
3120
+
3121
+ if (cacheable) {
3122
+ if (!hadCachedValue) {
3123
+ _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
3124
+ }
3125
+ if (!cache) {
3126
+ cache = meta.cache = {};
3127
+ }
3128
+ if (ret === undefined) {
3129
+ cache[keyName] = UNDEFINED;
3130
+ } else {
3131
+ cache[keyName] = ret;
3132
+ }
3133
+ }
3134
+
3135
+ if (watched) {
3136
+ _emberMetalProperty_events.propertyDidChange(obj, keyName);
3137
+ }
3138
+
3139
+ return ret;
3140
+ };
3141
+
3142
+ /* called before property is overridden */
3143
+ ComputedPropertyPrototype.teardown = function (obj, keyName) {
3144
+ var meta = metaFor(obj);
3145
+
3146
+ if (meta.cache) {
3147
+ if (keyName in meta.cache) {
3148
+ _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
3149
+ }
3150
+
3151
+ if (this._cacheable) {
3152
+ delete meta.cache[keyName];
3153
+ }
3154
+ }
3155
+
3156
+ return null; // no value to restore
3157
+ };
3166
3158
 
3167
3159
  /**
3168
- Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
3169
- a readOnly one way binding. Very often when using `computed.oneWay` one does
3170
- not also want changes to propagate back up, as they will replace the value.
3160
+ This helper returns a new property descriptor that wraps the passed
3161
+ computed property function. You can use this helper to define properties
3162
+ with mixins or via `Ember.defineProperty()`.
3171
3163
 
3172
- This prevents the reverse flow, and also throws an exception when it occurs.
3164
+ The function you pass will be used to both get and set property values.
3165
+ The function should accept two parameters, key and value. If value is not
3166
+ undefined you should set the value first. In either case return the
3167
+ current value of the property.
3173
3168
 
3174
- Example
3169
+ A computed property defined in this way might look like this:
3175
3170
 
3176
- ```javascript
3177
- var User = Ember.Object.extend({
3178
- firstName: null,
3179
- lastName: null,
3180
- nickName: Ember.computed.readOnly('firstName')
3181
- });
3171
+ ```js
3172
+ var Person = Ember.Object.extend({
3173
+ firstName: 'Betty',
3174
+ lastName: 'Jones',
3182
3175
 
3183
- var teddy = User.create({
3184
- firstName: 'Teddy',
3185
- lastName: 'Zeenny'
3176
+ fullName: Ember.computed('firstName', 'lastName', function(key, value) {
3177
+ return this.get('firstName') + ' ' + this.get('lastName');
3178
+ })
3186
3179
  });
3187
3180
 
3188
- teddy.get('nickName'); // 'Teddy'
3189
- teddy.set('nickName', 'TeddyBear'); // throws Exception
3190
- // throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
3191
- teddy.get('firstName'); // 'Teddy'
3192
- ```
3181
+ var client = Person.create();
3193
3182
 
3194
- @method readOnly
3195
- @for Ember.computed
3196
- @param {String} dependentKey
3197
- @return {Ember.ComputedProperty} computed property which creates a
3198
- one way computed property to the original value for property.
3199
- @since 1.5.0
3200
- @public
3201
- */
3202
-
3203
- function readOnly(dependentKey) {
3204
- return _emberMetalAlias["default"](dependentKey).readOnly();
3205
- }
3206
-
3207
- /**
3208
- A computed property that acts like a standard getter and setter,
3209
- but returns the value at the provided `defaultPath` if the
3210
- property itself has not been set to a value
3183
+ client.get('fullName'); // 'Betty Jones'
3211
3184
 
3212
- Example
3185
+ client.set('lastName', 'Fuller');
3186
+ client.get('fullName'); // 'Betty Fuller'
3187
+ ```
3213
3188
 
3214
- ```javascript
3215
- var Hamster = Ember.Object.extend({
3216
- wishList: Ember.computed.defaultTo('favoriteFood')
3217
- });
3189
+ _Note: This is the preferred way to define computed properties when writing third-party
3190
+ libraries that depend on or use Ember, since there is no guarantee that the user
3191
+ will have prototype extensions enabled._
3218
3192
 
3219
- var hamster = Hamster.create({ favoriteFood: 'Banana' });
3193
+ You might use this method if you disabled
3194
+ [Prototype Extensions](http://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/).
3195
+ The alternative syntax might look like this
3196
+ (if prototype extensions are enabled, which is the default behavior):
3220
3197
 
3221
- hamster.get('wishList'); // 'Banana'
3222
- hamster.set('wishList', 'More Unit Tests');
3223
- hamster.get('wishList'); // 'More Unit Tests'
3224
- hamster.get('favoriteFood'); // 'Banana'
3198
+ ```js
3199
+ fullName: function () {
3200
+ return this.get('firstName') + ' ' + this.get('lastName');
3201
+ }.property('firstName', 'lastName')
3225
3202
  ```
3226
3203
 
3227
- @method defaultTo
3228
- @for Ember.computed
3229
- @param {String} defaultPath
3230
- @return {Ember.ComputedProperty} computed property which acts like
3231
- a standard getter and setter, but defaults to the value from `defaultPath`.
3232
- @deprecated Use `Ember.computed.oneWay` or custom CP with default instead.
3204
+ @class computed
3205
+ @namespace Ember
3206
+ @constructor
3207
+ @static
3208
+ @param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.
3209
+ @param {Function} func The computed property function.
3210
+ @return {Ember.ComputedProperty} property descriptor instance
3233
3211
  @public
3234
3212
  */
3213
+ function computed(func) {
3214
+ var args;
3235
3215
 
3236
- function defaultTo(defaultPath) {
3237
- return _emberMetalComputed.computed({
3238
- get: function (key) {
3239
- _emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
3240
- return _emberMetalProperty_get.get(this, defaultPath);
3241
- },
3216
+ if (arguments.length > 1) {
3217
+ args = [].slice.call(arguments);
3218
+ func = args.pop();
3219
+ }
3242
3220
 
3243
- set: function (key, newValue, cachedValue) {
3244
- _emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
3245
- return newValue != null ? newValue : _emberMetalProperty_get.get(this, defaultPath);
3246
- }
3247
- });
3221
+ var cp = new ComputedProperty(func);
3222
+
3223
+ if (args) {
3224
+ cp.property.apply(cp, args);
3225
+ }
3226
+
3227
+ return cp;
3248
3228
  }
3249
3229
 
3250
3230
  /**
3251
- Creates a new property that is an alias for another property
3252
- on an object. Calls to `get` or `set` this property behave as
3253
- though they were called on the original property, but also
3254
- print a deprecation warning.
3231
+ Returns the cached value for a property, if one exists.
3232
+ This can be useful for peeking at the value of a computed
3233
+ property that is generated lazily, without accidentally causing
3234
+ it to be created.
3255
3235
 
3256
- @method deprecatingAlias
3257
- @for Ember.computed
3258
- @param {String} dependentKey
3259
- @return {Ember.ComputedProperty} computed property which creates an
3260
- alias with a deprecation to the original value for property.
3261
- @since 1.7.0
3236
+ @method cacheFor
3237
+ @for Ember
3238
+ @param {Object} obj the object whose property you want to check
3239
+ @param {String} key the name of the property whose cached value you want
3240
+ to return
3241
+ @return {Object} the cached value
3262
3242
  @public
3263
3243
  */
3244
+ function cacheFor(obj, key) {
3245
+ var meta = obj['__ember_meta__'];
3246
+ var cache = meta && meta.cache;
3247
+ var ret = cache && cache[key];
3264
3248
 
3265
- function deprecatingAlias(dependentKey) {
3266
- return _emberMetalComputed.computed(dependentKey, {
3267
- get: function (key) {
3268
- _emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
3269
- return _emberMetalProperty_get.get(this, dependentKey);
3270
- },
3271
- set: function (key, value) {
3272
- _emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
3273
- _emberMetalProperty_set.set(this, dependentKey, value);
3274
- return value;
3275
- }
3276
- });
3249
+ if (ret === UNDEFINED) {
3250
+ return undefined;
3251
+ }
3252
+ return ret;
3277
3253
  }
3254
+
3255
+ cacheFor.set = function (cache, key, value) {
3256
+ if (value === undefined) {
3257
+ cache[key] = UNDEFINED;
3258
+ } else {
3259
+ cache[key] = value;
3260
+ }
3261
+ };
3262
+
3263
+ cacheFor.get = function (cache, key) {
3264
+ var ret = cache[key];
3265
+ if (ret === UNDEFINED) {
3266
+ return undefined;
3267
+ }
3268
+ return ret;
3269
+ };
3270
+
3271
+ cacheFor.remove = function (cache, key) {
3272
+ cache[key] = undefined;
3273
+ };
3274
+
3275
+ exports.ComputedProperty = ComputedProperty;
3276
+ exports.computed = computed;
3277
+ exports.cacheFor = cacheFor;
3278
3278
  });
3279
3279
  enifed('ember-metal/core', ['exports'], function (exports) {
3280
3280
  /*globals Ember:true,ENV,EmberENV */
@@ -3299,7 +3299,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
3299
3299
 
3300
3300
  @class Ember
3301
3301
  @static
3302
- @version 1.13.11
3302
+ @version 1.13.12
3303
3303
  @public
3304
3304
  */
3305
3305
 
@@ -3333,11 +3333,11 @@ enifed('ember-metal/core', ['exports'], function (exports) {
3333
3333
 
3334
3334
  @property VERSION
3335
3335
  @type String
3336
- @default '1.13.11'
3336
+ @default '1.13.12'
3337
3337
  @static
3338
3338
  @public
3339
3339
  */
3340
- Ember.VERSION = '1.13.11';
3340
+ Ember.VERSION = '1.13.12';
3341
3341
 
3342
3342
  /**
3343
3343
  The hash of environment variables used to control various configuration
@@ -6980,6 +6980,75 @@ enifed("ember-metal/mixin", ["exports", "ember-metal/core", "ember-metal/merge",
6980
6980
  exports.REQUIRED = REQUIRED;
6981
6981
  });
6982
6982
  // warn, assert, wrap, et;
6983
+ enifed("ember-metal/observer_set", ["exports", "ember-metal/utils", "ember-metal/events"], function (exports, _emberMetalUtils, _emberMetalEvents) {
6984
+ "use strict";
6985
+
6986
+ /*
6987
+ this.observerSet = {
6988
+ [senderGuid]: { // variable name: `keySet`
6989
+ [keyName]: listIndex
6990
+ }
6991
+ },
6992
+ this.observers = [
6993
+ {
6994
+ sender: obj,
6995
+ keyName: keyName,
6996
+ eventName: eventName,
6997
+ listeners: [
6998
+ [target, method, flags]
6999
+ ]
7000
+ },
7001
+ ...
7002
+ ]
7003
+ */
7004
+ exports["default"] = ObserverSet;
7005
+
7006
+ function ObserverSet() {
7007
+ this.clear();
7008
+ }
7009
+
7010
+ ObserverSet.prototype.add = function (sender, keyName, eventName) {
7011
+ var observerSet = this.observerSet;
7012
+ var observers = this.observers;
7013
+ var senderGuid = _emberMetalUtils.guidFor(sender);
7014
+ var keySet = observerSet[senderGuid];
7015
+ var index;
7016
+
7017
+ if (!keySet) {
7018
+ observerSet[senderGuid] = keySet = {};
7019
+ }
7020
+ index = keySet[keyName];
7021
+ if (index === undefined) {
7022
+ index = observers.push({
7023
+ sender: sender,
7024
+ keyName: keyName,
7025
+ eventName: eventName,
7026
+ listeners: []
7027
+ }) - 1;
7028
+ keySet[keyName] = index;
7029
+ }
7030
+ return observers[index].listeners;
7031
+ };
7032
+
7033
+ ObserverSet.prototype.flush = function () {
7034
+ var observers = this.observers;
7035
+ var i, len, observer, sender;
7036
+ this.clear();
7037
+ for (i = 0, len = observers.length; i < len; ++i) {
7038
+ observer = observers[i];
7039
+ sender = observer.sender;
7040
+ if (sender.isDestroying || sender.isDestroyed) {
7041
+ continue;
7042
+ }
7043
+ _emberMetalEvents.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
7044
+ }
7045
+ };
7046
+
7047
+ ObserverSet.prototype.clear = function () {
7048
+ this.observerSet = {};
7049
+ this.observers = [];
7050
+ };
7051
+ });
6983
7052
  enifed("ember-metal/observer", ["exports", "ember-metal/watching", "ember-metal/array", "ember-metal/events"], function (exports, _emberMetalWatching, _emberMetalArray, _emberMetalEvents) {
6984
7053
  "use strict";
6985
7054
 
@@ -7110,75 +7179,6 @@ enifed("ember-metal/observer", ["exports", "ember-metal/watching", "ember-metal/
7110
7179
  return this;
7111
7180
  }
7112
7181
  });
7113
- enifed("ember-metal/observer_set", ["exports", "ember-metal/utils", "ember-metal/events"], function (exports, _emberMetalUtils, _emberMetalEvents) {
7114
- "use strict";
7115
-
7116
- /*
7117
- this.observerSet = {
7118
- [senderGuid]: { // variable name: `keySet`
7119
- [keyName]: listIndex
7120
- }
7121
- },
7122
- this.observers = [
7123
- {
7124
- sender: obj,
7125
- keyName: keyName,
7126
- eventName: eventName,
7127
- listeners: [
7128
- [target, method, flags]
7129
- ]
7130
- },
7131
- ...
7132
- ]
7133
- */
7134
- exports["default"] = ObserverSet;
7135
-
7136
- function ObserverSet() {
7137
- this.clear();
7138
- }
7139
-
7140
- ObserverSet.prototype.add = function (sender, keyName, eventName) {
7141
- var observerSet = this.observerSet;
7142
- var observers = this.observers;
7143
- var senderGuid = _emberMetalUtils.guidFor(sender);
7144
- var keySet = observerSet[senderGuid];
7145
- var index;
7146
-
7147
- if (!keySet) {
7148
- observerSet[senderGuid] = keySet = {};
7149
- }
7150
- index = keySet[keyName];
7151
- if (index === undefined) {
7152
- index = observers.push({
7153
- sender: sender,
7154
- keyName: keyName,
7155
- eventName: eventName,
7156
- listeners: []
7157
- }) - 1;
7158
- keySet[keyName] = index;
7159
- }
7160
- return observers[index].listeners;
7161
- };
7162
-
7163
- ObserverSet.prototype.flush = function () {
7164
- var observers = this.observers;
7165
- var i, len, observer, sender;
7166
- this.clear();
7167
- for (i = 0, len = observers.length; i < len; ++i) {
7168
- observer = observers[i];
7169
- sender = observer.sender;
7170
- if (sender.isDestroying || sender.isDestroyed) {
7171
- continue;
7172
- }
7173
- _emberMetalEvents.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
7174
- }
7175
- };
7176
-
7177
- ObserverSet.prototype.clear = function () {
7178
- this.observerSet = {};
7179
- this.observers = [];
7180
- };
7181
- });
7182
7182
  enifed('ember-metal/path_cache', ['exports', 'ember-metal/cache'], function (exports, _emberMetalCache) {
7183
7183
  'use strict';
7184
7184
 
@@ -12589,41 +12589,6 @@ enifed('ember-template-compiler/system/calculate-location-display', ['exports'],
12589
12589
  return moduleInfo;
12590
12590
  }
12591
12591
  });
12592
- enifed("ember-template-compiler/system/compile", ["exports", "ember-template-compiler/system/compile_options", "ember-template-compiler/system/template"], function (exports, _emberTemplateCompilerSystemCompile_options, _emberTemplateCompilerSystemTemplate) {
12593
- /**
12594
- @module ember
12595
- @submodule ember-template-compiler
12596
- */
12597
-
12598
- "use strict";
12599
-
12600
- var compile;
12601
-
12602
- /**
12603
- Uses HTMLBars `compile` function to process a string into a compiled template.
12604
-
12605
- This is not present in production builds.
12606
-
12607
- @private
12608
- @method compile
12609
- @param {String} templateString This is the string to be compiled by HTMLBars.
12610
- @param {Object} options This is an options hash to augment the compiler options.
12611
- */
12612
-
12613
- exports["default"] = function (templateString, options) {
12614
- if (!compile && Ember.__loader.registry['htmlbars-compiler/compiler']) {
12615
- compile = requireModule('htmlbars-compiler/compiler').compile;
12616
- }
12617
-
12618
- if (!compile) {
12619
- throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
12620
- }
12621
-
12622
- var templateSpec = compile(templateString, _emberTemplateCompilerSystemCompile_options["default"](options));
12623
-
12624
- return _emberTemplateCompilerSystemTemplate["default"](templateSpec);
12625
- };
12626
- });
12627
12592
  enifed("ember-template-compiler/system/compile_options", ["exports", "ember-metal/core", "ember-metal/merge", "ember-template-compiler/plugins"], function (exports, _emberMetalCore, _emberMetalMerge, _emberTemplateCompilerPlugins) {
12628
12593
  /**
12629
12594
  @module ember
@@ -12663,7 +12628,7 @@ enifed("ember-template-compiler/system/compile_options", ["exports", "ember-meta
12663
12628
 
12664
12629
  options.buildMeta = function buildMeta(program) {
12665
12630
  return {
12666
- revision: 'Ember@1.13.11',
12631
+ revision: 'Ember@1.13.12',
12667
12632
  loc: program.loc,
12668
12633
  moduleName: options.moduleName
12669
12634
  };
@@ -12672,6 +12637,41 @@ enifed("ember-template-compiler/system/compile_options", ["exports", "ember-meta
12672
12637
  return options;
12673
12638
  };
12674
12639
  });
12640
+ enifed("ember-template-compiler/system/compile", ["exports", "ember-template-compiler/system/compile_options", "ember-template-compiler/system/template"], function (exports, _emberTemplateCompilerSystemCompile_options, _emberTemplateCompilerSystemTemplate) {
12641
+ /**
12642
+ @module ember
12643
+ @submodule ember-template-compiler
12644
+ */
12645
+
12646
+ "use strict";
12647
+
12648
+ var compile;
12649
+
12650
+ /**
12651
+ Uses HTMLBars `compile` function to process a string into a compiled template.
12652
+
12653
+ This is not present in production builds.
12654
+
12655
+ @private
12656
+ @method compile
12657
+ @param {String} templateString This is the string to be compiled by HTMLBars.
12658
+ @param {Object} options This is an options hash to augment the compiler options.
12659
+ */
12660
+
12661
+ exports["default"] = function (templateString, options) {
12662
+ if (!compile && Ember.__loader.registry['htmlbars-compiler/compiler']) {
12663
+ compile = requireModule('htmlbars-compiler/compiler').compile;
12664
+ }
12665
+
12666
+ if (!compile) {
12667
+ throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
12668
+ }
12669
+
12670
+ var templateSpec = compile(templateString, _emberTemplateCompilerSystemCompile_options["default"](options));
12671
+
12672
+ return _emberTemplateCompilerSystemTemplate["default"](templateSpec);
12673
+ };
12674
+ });
12675
12675
  enifed('ember-template-compiler/system/precompile', ['exports', 'ember-template-compiler/system/compile_options'], function (exports, _emberTemplateCompilerSystemCompile_options) {
12676
12676
  /**
12677
12677
  @module ember
@@ -19137,8 +19137,8 @@ enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _mo
19137
19137
  return this.setNode(content);
19138
19138
  }
19139
19139
  /* Handlebars.SafeString */
19140
- if (typeof content.string === 'string') {
19141
- return this.setHTML(content.string);
19140
+ if (typeof content.toHTML === 'function') {
19141
+ return this.setHTML(content.toHTML());
19142
19142
  }
19143
19143
  if (this.parseTextAsHTML) {
19144
19144
  return this.setHTML(content.toString());