Index: src/sas/models/BaseModel.py
===================================================================
--- src/sas/models/BaseModel.py	(revision 794922220f2fb3b23dd08c648aabf87b4850596c)
+++ src/sas/models/BaseModel.py	(revision 794922220f2fb3b23dd08c648aabf87b4850596c)
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+
+############################################################################
+#This software was developed by the University of Tennessee as part of the
+#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
+#project funded by the US National Science Foundation.
+#
+#If you use DANSE applications to do scientific research that leads to
+#publication, we ask that you acknowledge the use of the software with the
+#following sentence:
+#
+#"This work benefited from DANSE software developed
+# under NSF award DMR-0520547."
+#
+#copyright 2008, University of Tennessee
+#############################################################################
+
+""" 
+Provide base functionality for all model components
+
+The following has changed since going from BaseComponent to BaseModel:
+
+    - Arithmetic operation between models is no longer supported.
+      It was found to be of little use and not very flexible.
+    
+    - Parameters are now stored as Parameter object to provide 
+      the necessary extra information like limits, units, etc... 
+"""
+
+# imports   
+import copy
+   
+class Parameter(object):
+    """
+    Parameter class
+    """
+    name  = ''
+    value = 0.0
+    def __init__(self, name, value):
+        self.name = name
+        self.value = value
+        
+    def __str__(self):
+        return "%s: %g" % (self.name, self.value)
+
+class ParameterProperty(object):
+    """
+    Parameter property allow direct access to
+    the parameter values
+    """
+    def __init__(self,name,**kw):
+        self.name = name
+       
+    def __get__(self,instance,cls):
+        return instance.parameters[self.name].value
+
+    def __set__(self,instance,value):
+        instance.parameters[self.name].value = value
+
+
+   
+from ModelAdaptor import ModelAdaptor
+
+class BaseModel(ModelAdaptor):
+    """ 
+    Basic model component
+    """
+    ## Name of the model
+    name = "BaseModel"
+    
+    def __init__(self):
+        ## Dictionary of Parameter objects
+        self.parameters = {}
+
+    # Evaluation methods to be implemented by the models
+    def run(self, x=0):  return NotImplemented
+    def runXY(self, x=0):  return NotImplemented
+    def calculate_ER(self):  return NotImplemented
+    def __call__(self, x=0):
+        """     
+        Evaluate the model. Equivalent to runXY(x)
+        
+        :param x: input value
+        
+        :return: value of the model
+        
+        """
+        return self.runXY(x)
+    
+    def clone(self):
+        """ Returns a new object identical to the current object """
+        
+        obj = copy.deepcopy(self)
+        obj.params = copy.deepcopy(self.params)
+        obj.details = copy.deepcopy(self.details)
+        return obj
+    
+    def setParam(self, name, value):
+        """ 
+        Set the value of a model parameter
+    
+        :param name: name of the parameter
+        :param value: value of the parameter
+        
+        """
+        # Lowercase for case insensitivity
+        name = name.lower()
+        if name in self.parameters:
+            print "found"
+            #self.parameters[name].value = value
+        return object.__setattr__(self, name, value)
+        
+    def getParam(self, name):
+        """ 
+        Set the value of a model parameter
+
+        :param name: name of the parameter
+        :param value: value of the parameter
+        
+        """
+        # Lowercase for case insensitivity
+        name = name.lower()
+        return object.__getattribute__(self, name)
+        
+    def getParamList(self):
+        """ 
+        Return a list of all available parameters for the model 
+        """
+        param_list = self.params.keys()
+        return param_list
+        
+    
+if __name__ == "__main__":
+    b = BaseModel() 
+    #print b.operateOn
+    
