whole_func_string: function(attrs, redraw) {
          var me = this,
              fontProps = me.fontProperties,
              fontPropsLength = fontProps.length,
              pathProps = me.pathProperties,
              pathPropsLength = pathProps.length,
              hasSurface = !!me.surface,
              custom = hasSurface && me.surface.customAttributes || {},
              spriteAttrs = me.attr,
              dirtyBBox = false,
              attr, i, newTranslation, translation, newRotate, rotation, newScaling, scaling;
  
          attrs = Ext.apply({}, attrs);
          for (attr in custom) {
              if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") {
                  Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr])));
              }
          }
  
          // Flag a change in hidden
          if (!!attrs.hidden !== !!spriteAttrs.hidden) {
              me.dirtyHidden = true;
          }
  
          // Flag path change
          for (i = 0; i < pathPropsLength; i++) {
              attr = pathProps[i];
              if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                  me.dirtyPath = true;
                  dirtyBBox = true;
                  break;
              }
          }
  
          // Flag zIndex change
          if ('zIndex' in attrs) {
              me.zIndexDirty = true;
          }
  
          // Flag font/text change
          if ('text' in attrs) {
              me.dirtyFont = true;
              dirtyBBox = true;
          }
  
          for (i = 0; i < fontPropsLength; i++) {
              attr = fontProps[i];
              if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                  me.dirtyFont = true;
                  dirtyBBox = true;
                  break;
              }
          }
  
          newTranslation = attrs.translation || attrs.translate;
          delete attrs.translate;
          delete attrs.translation;
          translation = spriteAttrs.translation;
          if (newTranslation) {
              if (('x' in newTranslation && newTranslation.x !== translation.x) ||
                  ('y' in newTranslation && newTranslation.y !== translation.y)) {
                  me.dirtyTransform = true;
                  translation.x = newTranslation.x;
                  translation.y = newTranslation.y;
              }
          }
  
          newRotate = attrs.rotation || attrs.rotate;
          rotation = spriteAttrs.rotation;
          delete attrs.rotate;
          delete attrs.rotation;
          if (newRotate) {
              if (('x' in newRotate && newRotate.x !== rotation.x) ||
                  ('y' in newRotate && newRotate.y !== rotation.y) ||
                  ('degrees' in newRotate && newRotate.degrees !== rotation.degrees)) {
                  me.dirtyTransform = true;
                  rotation.x = newRotate.x;
                  rotation.y = newRotate.y;
                  rotation.degrees = newRotate.degrees;
              }
          }
  
          newScaling = attrs.scaling || attrs.scale;
          scaling = spriteAttrs.scaling;
          delete attrs.scale;
          delete attrs.scaling;
          if (newScaling) {
              if (('x' in newScaling && newScaling.x !== scaling.x) ||
                  ('y' in newScaling && newScaling.y !== scaling.y) ||
                  ('cx' in newScaling && newScaling.cx !== scaling.cx) ||
                  ('cy' in newScaling && newScaling.cy !== scaling.cy)) {
                  me.dirtyTransform = true;
                  scaling.x = newScaling.x;
                  scaling.y = newScaling.y;
                  scaling.cx = newScaling.cx;
                  scaling.cy = newScaling.cy;
              }
          }
  
          // If the bbox is changed, then the bbox based transforms should be invalidated.
          if (!me.dirtyTransform && dirtyBBox) {
              if (spriteAttrs.scaling.x === null ||
                  spriteAttrs.scaling.y === null ||
                  spriteAttrs.rotation.y === null ||
                  spriteAttrs.rotation.y === null) {
                  me.dirtyTransform = true;
              }
          }
  
          Ext.apply(spriteAttrs, attrs);
          me.dirty = true;
  
          if (redraw === true && hasSurface) {
              me.redraw();
          }
          return this;
      }
func_code_string: function(attrs, redraw) {
          var me = this,
              fontProps = me.fontProperties,
              fontPropsLength = fontProps.length,
              pathProps = me.pathProperties,
              pathPropsLength = pathProps.length,
              hasSurface = !!me.surface,
              custom = hasSurface && me.surface.customAttributes || {},
              spriteAttrs = me.attr,
              dirtyBBox = false,
              attr, i, newTranslation, translation, newRotate, rotation, newScaling, scaling;
  
          attrs = Ext.apply({}, attrs);
          for (attr in custom) {
              if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") {
                  Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr])));
              }
          }
  
          // Flag a change in hidden
          if (!!attrs.hidden !== !!spriteAttrs.hidden) {
              me.dirtyHidden = true;
          }
  
          // Flag path change
          for (i = 0; i < pathPropsLength; i++) {
              attr = pathProps[i];
              if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                  me.dirtyPath = true;
                  dirtyBBox = true;
                  break;
              }
          }
  
          // Flag zIndex change
          if ('zIndex' in attrs) {
              me.zIndexDirty = true;
          }
  
          // Flag font/text change
          if ('text' in attrs) {
              me.dirtyFont = true;
              dirtyBBox = true;
          }
  
          for (i = 0; i < fontPropsLength; i++) {
              attr = fontProps[i];
              if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                  me.dirtyFont = true;
                  dirtyBBox = true;
                  break;
              }
          }
  
          newTranslation = attrs.translation || attrs.translate;
          delete attrs.translate;
          delete attrs.translation;
          translation = spriteAttrs.translation;
          if (newTranslation) {
              if (('x' in newTranslation && newTranslation.x !== translation.x) ||
                  ('y' in newTranslation && newTranslation.y !== translation.y)) {
                  me.dirtyTransform = true;
                  translation.x = newTranslation.x;
                  translation.y = newTranslation.y;
              }
          }
  
          newRotate = attrs.rotation || attrs.rotate;
          rotation = spriteAttrs.rotation;
          delete attrs.rotate;
          delete attrs.rotation;
          if (newRotate) {
              if (('x' in newRotate && newRotate.x !== rotation.x) ||
                  ('y' in newRotate && newRotate.y !== rotation.y) ||
                  ('degrees' in newRotate && newRotate.degrees !== rotation.degrees)) {
                  me.dirtyTransform = true;
                  rotation.x = newRotate.x;
                  rotation.y = newRotate.y;
                  rotation.degrees = newRotate.degrees;
              }
          }
  
          newScaling = attrs.scaling || attrs.scale;
          scaling = spriteAttrs.scaling;
          delete attrs.scale;
          delete attrs.scaling;
          if (newScaling) {
              if (('x' in newScaling && newScaling.x !== scaling.x) ||
                  ('y' in newScaling && newScaling.y !== scaling.y) ||
                  ('cx' in newScaling && newScaling.cx !== scaling.cx) ||
                  ('cy' in newScaling && newScaling.cy !== scaling.cy)) {
                  me.dirtyTransform = true;
                  scaling.x = newScaling.x;
                  scaling.y = newScaling.y;
                  scaling.cx = newScaling.cx;
                  scaling.cy = newScaling.cy;
              }
          }
  
          // If the bbox is changed, then the bbox based transforms should be invalidated.
          if (!me.dirtyTransform && dirtyBBox) {
              if (spriteAttrs.scaling.x === null ||
                  spriteAttrs.scaling.y === null ||
                  spriteAttrs.rotation.y === null ||
                  spriteAttrs.rotation.y === null) {
                  me.dirtyTransform = true;
              }
          }
  
          Ext.apply(spriteAttrs, attrs);
          me.dirty = true;
  
          if (redraw === true && hasSurface) {
              me.redraw();
          }
          return this;
      }
func_documentation_string: Change the attributes of the sprite.
  
  ## Translation
  
  For translate, the configuration object contains x and y attributes that indicate where to
  translate the object. For example:
  
  sprite.setAttributes({
  translate: {
  x: 10,
  y: 10
  }
  }, true);
  
  
  ## Rotation
  
  For rotation, the configuration object contains x and y attributes for the center of the rotation (which are optional),
  and a `degrees` attribute that specifies the rotation in degrees. For example:
  
  sprite.setAttributes({
  rotate: {
  degrees: 90
  }
  }, true);
  
  That example will create a 90 degrees rotation using the centroid of the Sprite as center of rotation, whereas:
  
  sprite.setAttributes({
  rotate: {
  x: 0,
  y: 0,
  degrees: 90
  }
  }, true);
  
  will create a rotation around the `(0, 0)` axis.
  
  
  ## Scaling
  
  For scaling, the configuration object contains x and y attributes for the x-axis and y-axis scaling. For example:
  
  sprite.setAttributes({
  scale: {
  x: 10,
  y: 3
  }
  }, true);
  
  You can also specify the center of scaling by adding `cx` and `cy` as properties:
  
  sprite.setAttributes({
  scale: {
  cx: 0,
  cy: 0,
  x: 10,
  y: 3
  }
  }, true);
  
  That last example will scale a sprite taking as centers of scaling the `(0, 0)` coordinate.
  
  @param {Object} attrs attributes to be changed on the sprite.
  @param {Boolean} redraw Flag to immediately draw the change.
  @return {Ext.draw.Sprite} this