1 var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
2 var global = require('../internals/global');
3 var isObject = require('../internals/is-object');
4 var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
5 var objectHas = require('../internals/has');
6 var shared = require('../internals/shared-store');
7 var sharedKey = require('../internals/shared-key');
8 var hiddenKeys = require('../internals/hidden-keys');
10 var WeakMap = global.WeakMap;
13 var enforce = function (it) {
14 return has(it) ? get(it) : set(it, {});
17 var getterFor = function (TYPE) {
18 return function (it) {
20 if (!isObject(it) || (state = get(it)).type !== TYPE) {
21 throw TypeError('Incompatible receiver, ' + TYPE + ' required');
26 if (NATIVE_WEAK_MAP) {
27 var store = shared.state || (shared.state = new WeakMap());
28 var wmget = store.get;
29 var wmhas = store.has;
30 var wmset = store.set;
31 set = function (it, metadata) {
33 wmset.call(store, it, metadata);
37 return wmget.call(store, it) || {};
40 return wmhas.call(store, it);
43 var STATE = sharedKey('state');
44 hiddenKeys[STATE] = true;
45 set = function (it, metadata) {
47 createNonEnumerableProperty(it, STATE, metadata);
51 return objectHas(it, STATE) ? it[STATE] : {};
54 return objectHas(it, STATE);