text: // Module for unit convertions
  SVG.Number = SVG.invent({
    // Initialize
    create: function(value, unit) {
      // initialize defaults
      this.value = 0
      this.unit  = unit || ''
  
      // parse value
      if (typeof value === 'number') {
        // ensure a valid numeric value
        this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value
  
      } else if (typeof value === 'string') {
        unit = value.match(SVG.regex.numberAndUnit)
  
        if (unit) {
          // make value numeric
          this.value = parseFloat(unit[1])
  
          // normalize
          if (unit[5] == '%')
            this.value /= 100
          else if (unit[5] == 's')
            this.value *= 1000
  
          // store unit
          this.unit = unit[5]
        }
  
      } else {
        if (value instanceof SVG.Number) {
          this.value = value.valueOf()
          this.unit  = value.unit
        }
      }
  
    }
    // Add methods
  , extend: {
      // Stringalize
      toString: function() {
        return (
          this.unit == '%' ?
            ~~(this.value * 1e8) / 1e6:
          this.unit == 's' ?
            this.value / 1e3 :
            this.value
        ) + this.unit
      }
    , toJSON: function() {
        return this.toString()
      }
    , // Convert to primitive
      valueOf: function() {
        return this.value
      }
      // Add number
    , plus: function(number) {
        number = new SVG.Number(number)
        return new SVG.Number(this + number, this.unit || number.unit)
      }
      // Subtract number
    , minus: function(number) {
        number = new SVG.Number(number)
        return new SVG.Number(this - number, this.unit || number.unit)
      }
      // Multiply number
    , times: function(number) {
        number = new SVG.Number(number)
        return new SVG.Number(this * number, this.unit || number.unit)
      }
      // Divide number
    , divide: function(number) {
        number = new SVG.Number(number)
        return new SVG.Number(this / number, this.unit || number.unit)
      }
      // Convert to different unit
    , to: function(unit) {
        var number = new SVG.Number(this)
  
        if (typeof unit === 'string')
          number.unit = unit
  
        return number
      }
      // Make number morphable
    , morph: function(number) {
        this.destination = new SVG.Number(number)
  
        if(number.relative) {
          this.destination.value += this.value
        }
  
        return this
      }
      // Get morphed number at given position
    , at: function(pos) {
        // Make sure a destination is defined
        if (!this.destination) return this
  
        // Generate new morphed number
        return new SVG.Number(this.destination)
            .minus(this)
            .times(pos)
            .plus(this)
      }
  
    }
  })
  