*** empty log message ***
diff --git a/Demo/classes/Complex.py b/Demo/classes/Complex.py
index 5880c64..b7ba2e0 100755
--- a/Demo/classes/Complex.py
+++ b/Demo/classes/Complex.py
@@ -4,16 +4,21 @@
 from math import sqrt
 
 
-def complex(re, im):
-	return Complex().init(re, im)
+class complex:
 
-
-class Complex:
-
-	def init(self, re, im):
+	def __init__(self, re, im):
 		self.re = float(re)
 		self.im = float(im)
-		return self
+
+	def __coerce__(self, other):
+		if type(other) == type(self):
+			if other.__class__ == self.__class__:
+				return self, other
+			else:
+				raise TypeError, 'cannot coerce to complex'
+		else:
+			# The cast to float() may raise an exception!
+			return self, complex(float(other), 0.0)
 
 	def __repr__(self):
 		return 'complex' + `self.re, self.im`
@@ -60,9 +65,16 @@
 def test():
 	a = complex(2, 0)
 	b = complex(3, 4)
-	print a, b
-	print a+b, a-b, a*b, a/b
-	print b+a, b-a, b*a, b/a
+	print a
+	print b
+	print a+b
+	print a-b
+	print a*b
+	print a/b
+	print b+a
+	print b-a
+	print b*a
+	print b/a
 	i = complex(0, 1)
 	print i, i*i, i*i*i, i*i*i*i
 	j = complex(1, 1)
diff --git a/Demo/classes/Dbm.py b/Demo/classes/Dbm.py
index 0bd5491..8d7fe0f 100755
--- a/Demo/classes/Dbm.py
+++ b/Demo/classes/Dbm.py
@@ -41,11 +41,11 @@
 
 
 def test():
-	d = Dbm('@dbm', 'rw', 0666)
+	d = Dbm('@dbm', 'rw', 0600)
 	print d
 	while 1:
 		try:
-			key = eval(raw_input('key: '))
+			key = input('key: ')
 			if d.has_key(key):
 				value = d[key]
 				print 'currently:', value
diff --git a/Demo/classes/README b/Demo/classes/README
index f821f78..cca7524 100644
--- a/Demo/classes/README
+++ b/Demo/classes/README
@@ -1,4 +1,4 @@
-Examples of classes that implement special operators (see class.doc):
+Examples of classes that implement special operators (see reference manual):
 
 Complex.py	Complex numbers
 Dates.py	Date manipulation package by Tim Peters
diff --git a/Demo/classes/Range.py b/Demo/classes/Range.py
index b8bc9be..e7b6be2 100755
--- a/Demo/classes/Range.py
+++ b/Demo/classes/Range.py
@@ -16,7 +16,7 @@
 		start, stop, step = a
 	else:
 		raise TypeError, 'range() needs 1-3 arguments'
-	return Range().init(start, stop, step)
+	return Range(start, stop, step)
 	
 
 # Class implementing a range object.
@@ -26,14 +26,13 @@
 class Range:
 
 	# initialization -- should be called only by range() above
-	def init(self, start, stop, step):
+	def __init__(self, start, stop, step):
 		if step == 0:
 			raise ValueError, 'range() called with zero step'
 		self.start = start
 		self.stop = stop
 		self.step = step
 		self.len = max(0, int((self.stop - self.start) / self.step))
-		return self
 
 	# implement `x` and is also used by print x
 	def __repr__(self):
diff --git a/Demo/classes/Rat.py b/Demo/classes/Rat.py
index 0d3e515..d10e4df 100755
--- a/Demo/classes/Rat.py
+++ b/Demo/classes/Rat.py
@@ -2,7 +2,7 @@
 
 
 def rat(num, den):
-	return Rat().init(num, den)
+	return Rat(num, den)
 
 
 def gcd(a, b):
@@ -13,13 +13,12 @@
 
 class Rat:
 
-	def init(self, num, den):
+	def __init__(self, num, den):
 		if den == 0:
 			raise ZeroDivisionError, 'rat(x, 0)'
 		g = gcd(num, den)
 		self.num = num/g
 		self.den = den/g
-		return self
 
 	def __repr__(self):
 		return 'rat' + `self.num, self.den`
@@ -49,8 +48,10 @@
 			return a, rat(b, 1L)
 		if t == type(0.0):
 			return a.__float__(), b
+		if t == type(a) and a.__class__ == b.__class__:
+			return a, b
 		raise TypeError, 'Rat.__coerce__: bad other arg'
-			
+
 	def __add__(a, b):
 		if type(b) <> type(a):
 			a, b = a.__coerce__(b)
@@ -93,4 +94,4 @@
 	except ZeroDivisionError:
 		print 'OK'
 
-#test()
+test()
diff --git a/Demo/classes/Rev.py b/Demo/classes/Rev.py
index 5cf4602..c1874c6 100755
--- a/Demo/classes/Rev.py
+++ b/Demo/classes/Rev.py
@@ -8,7 +8,7 @@
 # ... 
 # !dlroW olleH
 #
-# The .forw is so you can use anonymous sequences in init, and still
+# The .forw is so you can use anonymous sequences in __init__, and still
 # keep a reference the forward sequence. ) 
 # If you give it a non-anonymous mutable sequence, the reverse sequence
 # will track the updated values. ( but not reassignment! - another 
diff --git a/Demo/classes/Vec.py b/Demo/classes/Vec.py
index 6e2bc47..8289bc8 100755
--- a/Demo/classes/Vec.py
+++ b/Demo/classes/Vec.py
@@ -2,16 +2,15 @@
 
 
 def vec(*v):
-	return apply(Vec().init, v)
+	return apply(Vec, v)
 
 
 class Vec:
 
-	def init(self, *v):
+	def __init__(self, *v):
 		self.v = []
 		for x in v:
 			self.v.append(x)
-		return self
 
 
 	def fromlist(self, v):
diff --git a/Demo/classes/bitvec.py b/Demo/classes/bitvec.py
index 40cd13f..69718d7 100755
--- a/Demo/classes/bitvec.py
+++ b/Demo/classes/bitvec.py
@@ -48,7 +48,7 @@
 
 class BitVec:
 
-	def init(self, *params):
+	def __init__(self, *params):
 		self._data = 0L
 		self._len = 0
 		if not len(params):
@@ -93,20 +93,12 @@
 		else:
 			raise error, 'bitvec() requires 0 -- 2 parameter(s)'
 
-		return self
-
-
-	def _init(self, data, len):
-		self._data = data
-		self._len = len
-		return self
-
 		
 	def append(self, item):
 		#_check_value(item)
 		#self[self._len:self._len] = [item]
 		self[self._len:self._len] = \
-			  BitVec()._init(long(not not item), 1)
+			  BitVec(long(not not item), 1)
 
 		
 	def count(self, value):
@@ -138,7 +130,7 @@
 	def insert(self, index, item):
 		#_check_value(item)
 		#self[index:index] = [item]
-		self[index:index] = BitVec()._init(long(not not item), 1)
+		self[index:index] = BitVec(long(not not item), 1)
 
 
 	def remove(self, value):
@@ -163,7 +155,7 @@
 
 
 	def copy(self):
-		return BitVec()._init(self._data, self._len)
+		return BitVec(self._data, self._len)
 
 
 	def seq(self):
@@ -229,7 +221,7 @@
 		#rprt(`self`+'.__getslice__'+`i, j`+'\n')
 		i, j = _check_slice(self._len, i, j)
 		if i >= j:
-			return BitVec()._init(0L, 0)
+			return BitVec(0L, 0)
 		if i:
 			ndata = self._data >> i
 		else:
@@ -239,7 +231,7 @@
 			#we'll have to invent faster variants here
 			#e.g. mod_2exp
 			ndata = ndata & ((1L << nlength) - 1)
-		return BitVec()._init(ndata, nlength)
+		return BitVec(ndata, nlength)
 
 	def __setslice__(self, i, j, sequence, *rest):
 		#rprt(`self`+'.__setslice__'+`(i, j, sequence) + rest`+'\n')
@@ -274,16 +266,16 @@
 		if type(multiplier) != type(0):
 			raise TypeError, 'sequence subscript not int'
 		if multiplier <= 0:
-			return BitVec()._init(0L, 0)
+			return BitVec(0L, 0)
 		elif multiplier == 1:
 			return self.copy()
 		#handle special cases all 0 or all 1...
 		if self._data == 0L:
-			return BitVec()._init(0L, self._len * multiplier)
+			return BitVec(0L, self._len * multiplier)
 		elif (~self)._data == 0L:
-			return ~BitVec()._init(0L, self._len * multiplier)
+			return ~BitVec(0L, self._len * multiplier)
 		#otherwise el cheapo again...
-		retval = BitVec()._init(0L, 0)
+		retval = BitVec(0L, 0)
 		while multiplier:
 			retval, multiplier = retval + self, multiplier - 1
 		return retval
@@ -293,7 +285,7 @@
 		if type(otherseq) != type(self):
 			otherseq = apply(bitvec, (otherseq, ) + rest)
 		#sequence is now of our own type
-		return BitVec()._init(self._data & otherseq._data, \
+		return BitVec(self._data & otherseq._data, \
 			  min(self._len, otherseq._len))
 
 
@@ -302,7 +294,7 @@
 		if type(otherseq) != type(self):
 			otherseq = apply(bitvec, (otherseq, ) + rest)
 		#sequence is now of our own type
-		return BitVec()._init(self._data ^ otherseq._data, \
+		return BitVec(self._data ^ otherseq._data, \
 			  max(self._len, otherseq._len))
 
 
@@ -311,13 +303,13 @@
 		if type(otherseq) != type(self):
 			otherseq = apply(bitvec, (otherseq, ) + rest)
 		#sequence is now of our own type
-		return BitVec()._init(self._data | otherseq._data, \
+		return BitVec(self._data | otherseq._data, \
 			  max(self._len, otherseq._len))
 
 
 	def __invert__(self):
 		#rprt(`self`+'.__invert__()\n')
-		return BitVec()._init(~self._data & ((1L << self._len) - 1), \
+		return BitVec(~self._data & ((1L << self._len) - 1), \
 			  self._len)
 
 	def __coerce__(self, otherseq, *rest):
@@ -337,5 +329,4 @@
 		return float(self._data)
 
 
-def bitvec(params):
-	return apply(BitVec().init, params)
+bitvec = BitVec