The @param decorator, usable in an immutable class (see immutable), specifies that the following
    function is actually a transformation on an input parameter; the parameter is required, and is 
    set to the value returned by the function decorated by the parameter; i.e., if you decorate the
    function abc with @param, then imm.abc = x will result in imm's abc attribute being set to the
    value of type(imm).abc(x).

def param(f):
    '''
    The @param decorator, usable in an immutable class (see immutable), specifies that the following
    function is actually a transformation on an input parameter; the parameter is required, and is 
    set to the value returned by the function decorated by the parameter; i.e., if you decorate the
    function abc with @param, then imm.abc = x will result in imm's abc attribute being set to the
    value of type(imm).abc(x).
    '''
    (args, varargs, kwargs, dflts) = getargspec_py27like(f)
    if varargs is not None or kwargs is not None or dflts:
        raise ValueError('Params may not accept variable, variadic keyword, or default arguments')
    if len(args) != 1:
        raise ValueError('Parameter transformation functions must take exactly one argument')
    f._pimms_immutable_data_ = {}
    f._pimms_immutable_data_['is_param'] = True
    f._pimms_immutable_data_['name'] = f.__name__
    f = staticmethod(f)
    return f