       variable = @variable('suggested_' + Math.random())
     return variable
 
-  undeclare: (variable) ->
+  undeclare: (variable, moving) ->
     (@nullified ||= {})[variable.name] = variable
     if @added?[variable.name]
       delete @added[variable.name]
+    if !moving && @values[variable.name] != undefined
+      delete @variables[variable.name]
+    delete @values[variable.name]
+    @nullify(variable)
+
+
+
     #if variable.editing
     #  if variable.value
     #    @removeConstraint variable.editing

        if index > -1
          path.constraints.splice(index, 1)
          unless path.constraints.length
            @undeclare(path)
        if path.operations
          for op, index in path.operations by -1
            while op

  reconstrain: (other, constraint) ->
    return unless other.operation && constraint.operation
    if compared = @compare(other.operation, constraint.operation)
      if compared != true || !(suggested = @resuggest(other.operation, constraint.operation))
        @unconstrain(other, undefined, true)
        return
      else
        return true
