# New dir() function and other attribute-related goodies

# This should become a built-in function
#
def getattr(x, name):
	return eval('x.'+name)

# This should be the new dir(), except that it should still list
# the current local name space by default
#
def listattrs(x):
	try:
		dictkeys = x.__dict__.keys()
	except (AttributeError, TypeError):
		dictkeys = []
	#
	try:
		methods = x.__methods__
	except (AttributeError, TypeError):
		methods = []
	#
	try:
		members = x.__members__
	except (AttributeError, TypeError):
		members = []
	#
	try:
		the_class = x.__class__
	except (AttributeError, TypeError):
		the_class = None
	#
	try:
		bases = x.__bases__
	except (AttributeError, TypeError):
		bases = ()
	#
	total = dictkeys + methods + members
	if the_class:
		# It's a class instace; add the class's attributes
		# that are functions (methods)...
		class_attrs = listattrs(the_class)
		class_methods = []
		for name in class_attrs:
			if is_function(getattr(the_class, name)):
				class_methods.append(name)
		total = total + class_methods
	elif bases:
		# It's a derived class; add the base class attributes
		for base in bases:
			base_attrs = listattrs(base)
			total = total + base_attrs
	total.sort()
	return total
	i = 0
	while i+1 < len(total):
		if total[i] = total[i+1]:
			del total[i+1]
		else:
			i = i+1
	return total

# Helper to recognize functions
#
def is_function(x):
	return type(x) = type(is_function)

# Approximation of builtin dir(); this lists the user's
# variables by default, not the current local name space.
# Use a class method to make a function that can be called
# with or without arguments.
#
class _dirclass:
	def dir(args):
		if type(args) = type(()):
			return listattrs(args[1])
		else:
			import __main__
			return listattrs(__main__)
dir = _dirclass().dir
