Index: sansmodels/src/sans/models/dispersion_models.py
===================================================================
--- sansmodels/src/sans/models/dispersion_models.py	(revision 0f5bc9ff2027432913fd8d2cb067675244acdaf6)
+++ sansmodels/src/sans/models/dispersion_models.py	(revision 0f5bc9ff2027432913fd8d2cb067675244acdaf6)
@@ -0,0 +1,100 @@
+"""
+    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
+"""
+
+"""
+    Class definitions for python dispersion model for 
+    model parameters. These classes are bridges to the C++
+    dispersion object.
+    
+    The ArrayDispersion class takes in numpy arrays only.
+    
+    Usage:
+    These classes can be used to set the dispersion model of a SANS model
+    parameter:
+    
+        cyl = CylinderModel()
+        cyl.set_dispersion('radius', GaussianDispersion())
+    
+    
+    After the dispersion model is set, you can access it's
+    parameter through the dispersion dictionary:
+    
+        cyl.dispersion['radius']['width'] = 5.0
+    
+    TODO: For backward compatibility, the model parameters are still kept in
+    a dictionary. The next iteration of refactoring work should involve moving
+    away from value-based parameters to object-based parameter. We want to
+    store parameters as objects so that we can unify the 'params' and 'dispersion'
+    dictionaries into a single dictionary of parameter objects that hold the
+    complete information about the parameter (units, limits, dispersion model, etc...).  
+    
+    
+"""
+import sans_extension.c_models as c_models 
+
+class DispersionModel:
+    """
+        Python bridge class for a basic dispersion model 
+        class with a constant parameter value distribution
+    """
+    def __init__(self):
+        self.cdisp = c_models.new_dispersion_model()
+        
+    def set_weights(self, values, weights):
+        """
+            Set the weights of an array dispersion
+        """
+        message = "set_weights is not available for DispersionModel.\n"
+        message += "  Solution: Use an ArrayDispersion object"
+        raise "RuntimeError", message
+        
+class GaussianDispersion(DispersionModel):
+    """
+        Python bridge class for a dispersion model based 
+        on a Gaussian distribution.
+    """
+    def __init__(self):
+        self.cdisp = c_models.new_gaussian_model()
+        
+    def set_weights(self, values, weights):
+        """
+            Set the weights of an array dispersion
+        """
+        message = "set_weights is not available for GaussiantDispersion.\n"
+        message += "  Solution: Use an ArrayDispersion object"
+        raise "RuntimeError", message
+        
+class ArrayDispersion(DispersionModel):
+    """
+        Python bridge class for a dispersion model based on arrays.
+        The user has to set a weight distribution that
+        will be used in the averaging the model parameter
+        it is applied to. 
+    """
+    def __init__(self):
+        self.cdisp = c_models.new_array_model()
+        
+    def set_weights(self, values, weights):
+        """
+            Set the weights of an array dispersion
+            Only accept numpy arrays.
+            @param values: numpy array of values
+            @param weights: numpy array of weights for each value entry
+        """
+        if len(values) != len(weights):
+            raise ValueError, "ArrayDispersion.set_weights: given arrays are of different lengths"
+        
+        c_models.set_dispersion_weights(self.cdisp, values, weights)
+        
+        
