docs: function Sprite (opts) {
      Sprite.superclass.constructor.call(this, opts)
  
      opts = opts || {}
  
      var file         = opts.file
        , url          = opts.url
        , textureAtlas = opts.textureAtlas
        , texture      = opts.texture
        , frame        = opts.frame
        , spritesheet  = opts.spritesheet
        , rect         = opts.rect
        , frameName    = opts.frameName
  
      this.anchorPoint = ccp(0.5, 0.5)
  
      this.offsetPosition = ccp(0, 0)
      this.unflippedOffsetPositionFromCenter = ccp(0, 0)
  
      if (frameName) {
          frame = SpriteFrameCache.sharedSpriteFrameCache.getSpriteFrame(frameName)
      }
  
      if (frame) {
          texture = frame.texture
          rect    = frame.rect
      }
  
      events.addListener(this, 'dirtytransform', this._updateQuad.bind(this))
      events.addPropertyListener(this, 'textureAtlas', 'change', this._updateTextureQuad.bind(this))
  
      if (url || file || texture) {
          textureAtlas = new TextureAtlas({ url: url, file: file, texture: texture })
      } else if (spritesheet) {
          textureAtlas = spritesheet.textureAtlas
          this.useSpriteSheet = true
      } else if (!textureAtlas) {
          //throw "Sprite has no texture"
      }
  
      if (!rect && textureAtlas) {
          if (!url) {
              rect = new geo.Rect(0, 0, textureAtlas.texture.size.width, textureAtlas.texture.size.height)
          } else {
              // Loading remote image, wait for it to finish before setting rect
              events.addListener(textureAtlas, 'load', function () {
                  if (!this.rect) {
                      this.rect = new geo.Rect(0, 0, textureAtlas.texture.size.width, textureAtlas.texture.size.height)
                  }
              }.bind(this))
          }
      }
  
      if (rect) {
          this.rect = rect
          this.contentSize = rect.size
  
          this.quad = { drawRect: {origin: ccp(0, 0), size: rect.size}
                      , textureRect: rect
                      }
      }
  
      this.textureAtlas = textureAtlas
  
      if (frame) {
          this.displayFrame = frame
      }
  }