1 var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
2 var global = require('../internals/global');
3 var uncurryThis = require('../internals/function-uncurry-this');
4 var isObject = require('../internals/is-object');
5 var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
6 var hasOwn = require('../internals/has-own-property');
7 var shared = require('../internals/shared-store');
8 var sharedKey = require('../internals/shared-key');
9 var hiddenKeys = require('../internals/hidden-keys');
11 var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
12 var TypeError = global.TypeError;
13 var WeakMap = global.WeakMap;
16 var enforce = function (it) {
17 return has(it) ? get(it) : set(it, {});
20 var getterFor = function (TYPE) {
21 return function (it) {
23 if (!isObject(it) || (state = get(it)).type !== TYPE) {
24 throw TypeError('Incompatible receiver, ' + TYPE + ' required');
29 if (NATIVE_WEAK_MAP || shared.state) {
30 var store = shared.state || (shared.state = new WeakMap());
31 var wmget = uncurryThis(store.get);
32 var wmhas = uncurryThis(store.has);
33 var wmset = uncurryThis(store.set);
34 set = function (it, metadata) {
35 if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
37 wmset(store, it, metadata);
41 return wmget(store, it) || {};
44 return wmhas(store, it);
47 var STATE = sharedKey('state');
48 hiddenKeys[STATE] = true;
49 set = function (it, metadata) {
50 if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
52 createNonEnumerableProperty(it, STATE, metadata);
56 return hasOwn(it, STATE) ? it[STATE] : {};
59 return hasOwn(it, STATE);