descriptor.js
 1  'use strict';
 2  
 3  var isCallable = require('./is-callable')
 4    , callable   = require('./valid-callable')
 5    , contains   = require('../String/prototype/contains')
 6  
 7    , d;
 8  
 9  d = module.exports = function (dscr, value) {
10  	var c, e, w;
11  	if (arguments.length < 2) {
12  		value = dscr;
13  		dscr = null;
14  	}
15  	if (dscr == null) {
16  		c = w = true;
17  		e = false;
18  	} else {
19  		c = contains.call(dscr, 'c');
20  		e = contains.call(dscr, 'e');
21  		w = contains.call(dscr, 'w');
22  	}
23  
24  	return { value: value, configurable: c, enumerable: e, writable: w };
25  };
26  
27  d.gs = function (dscr, get, set) {
28  	var c, e;
29  	if (isCallable(dscr)) {
30  		set = (get == null) ? undefined : callable(get);
31  		get = dscr;
32  		dscr = null;
33  	} else {
34  		get = (get == null) ? undefined : callable(get);
35  		set = (set == null) ? undefined : callable(set);
36  	}
37  	if (dscr == null) {
38  		c = true;
39  		e = false;
40  	} else {
41  		c = contains.call(dscr, 'c');
42  		e = contains.call(dscr, 'e');
43  	}
44  
45  	return { get: get, set: set, configurable: c, enumerable: e };
46  };