def inverse=(attribute)
      return if inverse == attribute
      # if no attribute, then the clear the existing inverse, if any
      return clear_inverse if attribute.nil?
      # the inverse attribute meta-data
      begin
        @inv_prop = type.property(attribute)
      rescue NameError => e
        raise MetadataError.new("#{@declarer.qp}.#{self} inverse attribute #{type.qp}.#{attribute} not found")
      end
      # the inverse of the inverse
      inv_inv_prop = @inv_prop.inverse_property
      # If the inverse of the inverse is already set to a different attribute, then raise an exception.
      if inv_inv_prop and not (inv_inv_prop == self or inv_inv_prop.restriction?(self))
        raise MetadataError.new("Cannot set #{type.qp}.#{attribute} inverse attribute to #{@declarer.qp}.#{self}@#{object_id} since it conflicts with existing inverse #{inv_inv_prop.declarer.qp}.#{inv_inv_prop}@#{inv_inv_prop.object_id}")
      end
      # Set the inverse of the inverse to this attribute.
      @inv_prop.inverse = @attribute
      # If this attribute is disjoint, then so is the inverse.
      @inv_prop.qualify(:disjoint) if disjoint?
      logger.debug { "Assigned #{@declarer.qp}.#{self} attribute inverse to #{type.qp}.#{attribute}." }
    end
def inverse=(attribute)
      return if inverse == attribute
      # if no attribute, then the clear the existing inverse, if any
      return clear_inverse if attribute.nil?
      # the inverse attribute meta-data
      begin
        @inv_prop = type.property(attribute)
      rescue NameError => e
        raise MetadataError.new("#{@declarer.qp}.#{self} inverse attribute #{type.qp}.#{attribute} not found")
      end
      # the inverse of the inverse
      inv_inv_prop = @inv_prop.inverse_property
      # If the inverse of the inverse is already set to a different attribute, then raise an exception.
      if inv_inv_prop and not (inv_inv_prop == self or inv_inv_prop.restriction?(self))
        raise MetadataError.new("Cannot set #{type.qp}.#{attribute} inverse attribute to #{@declarer.qp}.#{self}@#{object_id} since it conflicts with existing inverse #{inv_inv_prop.declarer.qp}.#{inv_inv_prop}@#{inv_inv_prop.object_id}")
      end
      # Set the inverse of the inverse to this attribute.
      @inv_prop.inverse = @attribute
      # If this attribute is disjoint, then so is the inverse.
      @inv_prop.qualify(:disjoint) if disjoint?
      logger.debug { "Assigned #{@declarer.qp}.#{self} attribute inverse to #{type.qp}.#{attribute}." }
    end
Sets the inverse of the subject attribute to the given attribute.
 The inverse relation is symmetric, i.e. the inverse of the referenced Property
 is set to this Property's subject attribute.

 @param [Symbol, nil] attribute the inverse attribute
 @raise [MetadataError] if the the inverse of the inverse is already set to a different attribute