docs: function (opts) {
          var plistPath = opts.file,
              plist = new Plist({file: plistPath}),
              plistData = plist.data
  
  
          var metaDataDict = plistData.metadata,
              framesDict = plistData.frames
  
          var format = 0,
              texturePath = null
  
          if (metaDataDict) {
              format = metaDataDict.format
              // Get texture path from meta data
              texturePath = metaDataDict.textureFileName
          }
  
          if (!texturePath) {
              // No texture path so assuming it's the same name as the .plist but ending in .png
              texturePath = plistPath.replace(/\.plist$/i, '.png')
          }
  
  
          var texture = new Texture2D({file: texturePath})
  
          // Add frames
          for (var frameDictKey in framesDict) {
              if (framesDict.hasOwnProperty(frameDictKey)) {
                  var frameDict = framesDict[frameDictKey],
                      spriteFrame = null
  
                  switch (format) {
                  case 0:
                      var x = frameDict.x,
                          y =  frameDict.y,
                          w =  frameDict.width,
                          h =  frameDict.height,
                          ox = frameDict.offsetX,
                          oy = frameDict.offsetY,
                          ow = frameDict.originalWidth,
                          oh = frameDict.originalHeight
  
                      // check ow/oh
                      if (!ow || !oh) {
                          //console.log("cocos2d: WARNING: originalWidth/Height not found on the CCSpriteFrame. AnchorPoint won't work as expected. Regenerate the .plist")
                      }
  
                      if (cc.FLIP_Y_AXIS) {
                          oy *= -1
                      }
  
                      // abs ow/oh
                      ow = Math.abs(ow)
                      oh = Math.abs(oh)
  
                      // create frame
                      spriteFrame = new SpriteFrame({texture: texture,
                                                           rect: geo.rectMake(x, y, w, h),
                                                         rotate: false,
                                                         offset: geo.ccp(ox, oy),
                                                   originalSize: geo.sizeMake(ow, oh)})
                      break
  
                  case 1:
                  case 2:
                      var frame      = geo.rectFromString(frameDict.frame),
                          rotated    = !!frameDict.rotated,
                          offset     = geo.pointFromString(frameDict.offset),
                          sourceSize = geo.sizeFromString(frameDict.sourceSize)
  
                      if (cc.FLIP_Y_AXIS) {
                          offset.y *= -1
                      }
  
  
                      // create frame
                      spriteFrame = new SpriteFrame({texture: texture,
                                                           rect: frame,
                                                         rotate: rotated,
                                                         offset: offset,
                                                   originalSize: sourceSize})
                      break
  
                  case 3:
                      var spriteSize       = geo.sizeFromString(frameDict.spriteSize),
                          spriteOffset     = geo.pointFromString(frameDict.spriteOffset),
                          spriteSourceSize = geo.sizeFromString(frameDict.spriteSourceSize),
                          textureRect      = geo.rectFromString(frameDict.textureRect),
                          textureRotated   = frameDict.textureRotated
  
  
                      if (cc.FLIP_Y_AXIS) {
                          spriteOffset.y *= -1
                      }
  
                      // get aliases
                      var aliases = frameDict.aliases
                      for (var i = 0, len = aliases.length; i < len; i++) {
                          var alias = aliases[i]
                          this.spriteFrameAliases[frameDictKey] = alias
                      }
  
                      // create frame
                      spriteFrame = new SpriteFrame({texture: texture,
                                                           rect: geo.rectMake(textureRect.origin.x, textureRect.origin.y, spriteSize.width, spriteSize.height),
                                                         rotate: textureRotated,
                                                         offset: spriteOffset,
                                                   originalSize: spriteSourceSize})
                      break
  
                  default:
                      throw "Unsupported Zwoptex format: " + format
                  }
  
                  // Add sprite frame
                  this.spriteFrames[frameDictKey] = spriteFrame
              }
          }
      }