
_ = null;

Inspect = {
    inheritance: function (o) {
	o = o || _;
	var r = [];
	var curr = _;
	while (curr != null) {
	    r.push(curr);
	    curr = curr.__proto__;
	}
	return r;
    },

    slots: function (o) {
	o = o || _;

	var canCheck = false;
	try {
	    if (o.hasOwnProperty) {
		canCheck = true;
	    }
	} catch (e) {}

	var r = [];
	for (var s in o) {
	    if (!canCheck || o.hasOwnProperty(s)) {
		r.push(s);
	    }
	}
	return r;
    },

    limit: function (s, lim) {
	if (s.length > lim) {
	    return s.substring(0, lim) + " ...";
	} else {
	    return s;
	}
    },

    dir: function (showCode) {
	Inspect.inheritance().each
	(function (o) {
	     print("-- " + Inspect.limit(JSON.stringify(o), 70));
	     Inspect.slots(o).each
	     (function (name) {
		  var v = o[name];
		  if (typeof v == 'function') {
		      if (showCode) {
			  print("  * " + name + ":");
			  print(v);
		      }
		  } else {
		      if (showCode != 'only') {
			  print("  * " + name + ": " +
				Inspect.limit(JSON.stringify(v), 70 - 3 - name.length));
		      }
		  }
	      })
	 });
    },
}

