     @start.row == other.start.row && @end.row == other.end.row
 
   add: (point) ->
-    new Range(@start.add(point), @end.add(point))
+    new @constructor(@start.add(point), @end.add(point))
 
   translate: (startPoint, endPoint=startPoint) ->
-    new Range(@start.translate(startPoint), @end.translate(endPoint))
+    new @constructor(@start.translate(startPoint), @end.translate(endPoint))
 
   intersectsWith: (otherRange) ->
     if @start.isLessThanOrEqual(otherRange.start)

  union: (otherRange) ->
    start = if @start.isLessThan(otherRange.start) then @start else otherRange.start
    end = if @end.isGreaterThan(otherRange.end) then @end else otherRange.end
    new Range(start, end)

  isEmpty: ->
    @start.isEqual(@end)

class Range
  @fromObject: (object, copy) ->
    if Array.isArray(object)
      new this(object...)
    else if object instanceof this
      if copy then object.copy() else object
    else
      new this(object.start, object.end)

  @fromPointWithDelta: (pointA, rowDelta, columnDelta) ->
    pointA = Point.fromObject(pointA)
    pointB = new Point(pointA.row + rowDelta, pointA.column + columnDelta)
    new this(pointA, pointB)

  @fromText: (args...) ->
    if args.length > 1
