using generics. Removed ICloneable