code: def feature(self,feat=None,searchforit=False,init=None):
  		
  		if feat==None:
  			return self.feats
  
  		if not init:
  			init=self
  			init.tick=0
  			init._matches=[]
  			feat=feat.strip()
  			if feat.startswith("+"):
  				init._eval=True
  				feat=feat[1:]
  			elif feat.startswith("-"):
  				init._eval=False
  				feat=feat[1:]
  			else:
  				init._eval=None
  
  		if (hasattr(self,'feats')) and (feat in self.feats):
  			if type(self.feats[feat]) == type([]):
  				if len(self.feats[feat]) > 1:
  					return self.feats[feat]
  				else:
  					return self.feats[feat][0]
  			else:
  				return self.feats[feat]
  		else:
  			if searchforit:
  
  				for child in self.descendants():
  					init.tick+=1
  					x=child.feature(feat,searchforit,init)
  					#print init.tick, self.classname(), child.classname(), x
  					if x==None: continue
  					init._matches.append ( (child,x) )
  
  
  				#return [child.feature(feat,searchforit) for child in self.descendants()]
  			else:
  				return None
  			#if searchforit:
  			#	return self.search(SearchTerm(feat))
  			#else:
  			#	None
  
  		if self==init:
  
  			if init._eval==None:
  				return init._matches
  			else:
  				return [ x for (x,y) in init._matches if bool(y)==init._eval ]
docs: Returns value of self.feats[feat].
  		If searchforit==True, will search in this object's children recursively.
  		If not found, returns None.