'Just like in js: self.prop op= val
for example when op is \'+\' it will be self.prop+=val
op can be either None for simple assignment or one of:'

def put(self, prop, val, op=None):

    if ((self.Class == 'Undefined') or (self.Class == 'Null')):
        raise MakeError('TypeError', 'Undefiend    and    null    dont    have    properties!')
    if (not isinstance(prop, basestring)):
        prop = prop.to_string().value
    if (op is not None):
        val = getattr(self.get(prop), OP_METHODS[op])(val)
    if (not self.can_put(prop)):
        return val
    own_desc = self.get_own_property(prop)
    if is_data_descriptor(own_desc):
        if (self.Class == 'Array'):
            self.define_own_property(prop, {'value': val})
        else:
            self.own[prop]['value'] = val
        return val
    desc = self.get_property(prop)
    if is_accessor_descriptor(desc):
        desc['set'].call(self, (val,))
    else:
        new = {'value': val, 'writable': True, 'configurable': True, 'enumerable': True}
        if (self.Class == 'Array'):
            self.define_own_property(prop, new)
        else:
            self.own[prop] = new
    return val
