whole_func_string: function(cell, renderingOnlyAttrs) {
  
          var allAttrs = this.model.get('attrs');
  
          var rotatable = V(this.$('.rotatable')[0]);
          if (rotatable) {
  
              var rotation = rotatable.attr('transform');
              rotatable.attr('transform', '');
          }
          
          var relativelyPositioned = [];
  
          _.each(renderingOnlyAttrs || allAttrs, function(attrs, selector) {
  
              // Elements that should be updated.
              var $selected = this.findBySelector(selector);
  
              // No element matched by the `selector` was found. We're done then.
              if ($selected.length === 0) return;
  
              // Special attributes are treated by JointJS, not by SVG.
              var specialAttributes = ['style', 'text', 'html', 'ref-x', 'ref-y', 'ref-dx', 'ref-dy', 'ref', 'x-alignment', 'y-alignment', 'port'];
  
              // If the `filter` attribute is an object, it is in the special JointJS filter format and so
              // it becomes a special attribute and is treated separately.
              if (_.isObject(attrs.filter)) {
  
                  specialAttributes.push('filter');
                  this.applyFilter(selector, attrs.filter);
              }
  
              // If the `fill` or `stroke` attribute is an object, it is in the special JointJS gradient format and so
              // it becomes a special attribute and is treated separately.
              if (_.isObject(attrs.fill)) {
  
                  specialAttributes.push('fill');
                  this.applyGradient(selector, 'fill', attrs.fill);
              }
              if (_.isObject(attrs.stroke)) {
  
                  specialAttributes.push('stroke');
                  this.applyGradient(selector, 'stroke', attrs.stroke);
              }
              
              // Set regular attributes on the `$selected` subelement. Note that we cannot use the jQuery attr()
              // method as some of the attributes might be namespaced (e.g. xlink:href) which fails with jQuery attr().
              var finalAttributes = _.omit(attrs, specialAttributes);
              
              $selected.each(function() {
                  
                  V(this).attr(finalAttributes);
              });
  
              // `port` attribute contains the `id` of the port that the underlying magnet represents.
              if (attrs.port) {
  
                  $selected.attr('port', _.isUndefined(attrs.port.id) ? attrs.port : attrs.port.id);
              }
  
              // `style` attribute is special in the sense that it sets the CSS style of the subelement.
              if (attrs.style) {
  
                  $selected.css(attrs.style);
              }
              
              // Make special case for `text` attribute. So that we can set text content of the `<text>` element
              // via the `attrs` object as well.
              if (!_.isUndefined(attrs.text)) {
  
                  $selected.each(function() {
  
                      V(this).text(attrs.text + '');
                  });
              }
  
              if (!_.isUndefined(attrs.html)) {
  
                  $selected.each(function() {
  
                      $(this).html(attrs.html + '');
                  });
              }
              
              // Special `ref-x` and `ref-y` attributes make it possible to set both absolute or
              // relative positioning of subelements.
              if (!_.isUndefined(attrs['ref-x']) ||
                  !_.isUndefined(attrs['ref-y']) ||
                  !_.isUndefined(attrs['ref-dx']) ||
                  !_.isUndefined(attrs['ref-dy']) ||
  		!_.isUndefined(attrs['x-alignment']) ||
  		!_.isUndefined(attrs['y-alignment'])
                 ) {
  
                  relativelyPositioned.push($selected);
              }
              
          }, this);
  
          // We don't want the sub elements to affect the bounding box of the root element when
          // positioning the sub elements relatively to the bounding box.
          //_.invoke(relativelyPositioned, 'hide');
          //_.invoke(relativelyPositioned, 'show');
  
          // Note that we're using the bounding box without transformation because we are already inside
          // a transformed coordinate system.
          var bbox = this.el.getBBox();        
  
          renderingOnlyAttrs = renderingOnlyAttrs || {};
  
          _.each(relativelyPositioned, function($el) {
  
              // if there was a special attribute affecting the position amongst renderingOnlyAttributes
              // we have to merge it with rest of the element's attributes as they are necessary
              // to update the position relatively (i.e `ref`)
              var renderingOnlyElAttrs = renderingOnlyAttrs[$el.selector];
              var elAttrs = renderingOnlyElAttrs
                  ? _.merge({}, allAttrs[$el.selector], renderingOnlyElAttrs)
                  : allAttrs[$el.selector];
  
              this.positionRelative($el, bbox, elAttrs);
              
          }, this);
  
          if (rotatable) {
  
              rotatable.attr('transform', rotation || '');
          }
      }
func_code_string: function(cell, renderingOnlyAttrs) {
  
          var allAttrs = this.model.get('attrs');
  
          var rotatable = V(this.$('.rotatable')[0]);
          if (rotatable) {
  
              var rotation = rotatable.attr('transform');
              rotatable.attr('transform', '');
          }
          
          var relativelyPositioned = [];
  
          _.each(renderingOnlyAttrs || allAttrs, function(attrs, selector) {
  
              // Elements that should be updated.
              var $selected = this.findBySelector(selector);
  
              // No element matched by the `selector` was found. We're done then.
              if ($selected.length === 0) return;
  
              // Special attributes are treated by JointJS, not by SVG.
              var specialAttributes = ['style', 'text', 'html', 'ref-x', 'ref-y', 'ref-dx', 'ref-dy', 'ref', 'x-alignment', 'y-alignment', 'port'];
  
              // If the `filter` attribute is an object, it is in the special JointJS filter format and so
              // it becomes a special attribute and is treated separately.
              if (_.isObject(attrs.filter)) {
  
                  specialAttributes.push('filter');
                  this.applyFilter(selector, attrs.filter);
              }
  
              // If the `fill` or `stroke` attribute is an object, it is in the special JointJS gradient format and so
              // it becomes a special attribute and is treated separately.
              if (_.isObject(attrs.fill)) {
  
                  specialAttributes.push('fill');
                  this.applyGradient(selector, 'fill', attrs.fill);
              }
              if (_.isObject(attrs.stroke)) {
  
                  specialAttributes.push('stroke');
                  this.applyGradient(selector, 'stroke', attrs.stroke);
              }
              
              // Set regular attributes on the `$selected` subelement. Note that we cannot use the jQuery attr()
              // method as some of the attributes might be namespaced (e.g. xlink:href) which fails with jQuery attr().
              var finalAttributes = _.omit(attrs, specialAttributes);
              
              $selected.each(function() {
                  
                  V(this).attr(finalAttributes);
              });
  
              // `port` attribute contains the `id` of the port that the underlying magnet represents.
              if (attrs.port) {
  
                  $selected.attr('port', _.isUndefined(attrs.port.id) ? attrs.port : attrs.port.id);
              }
  
              // `style` attribute is special in the sense that it sets the CSS style of the subelement.
              if (attrs.style) {
  
                  $selected.css(attrs.style);
              }
              
              // Make special case for `text` attribute. So that we can set text content of the `<text>` element
              // via the `attrs` object as well.
              if (!_.isUndefined(attrs.text)) {
  
                  $selected.each(function() {
  
                      V(this).text(attrs.text + '');
                  });
              }
  
              if (!_.isUndefined(attrs.html)) {
  
                  $selected.each(function() {
  
                      $(this).html(attrs.html + '');
                  });
              }
              
              // Special `ref-x` and `ref-y` attributes make it possible to set both absolute or
              // relative positioning of subelements.
              if (!_.isUndefined(attrs['ref-x']) ||
                  !_.isUndefined(attrs['ref-y']) ||
                  !_.isUndefined(attrs['ref-dx']) ||
                  !_.isUndefined(attrs['ref-dy']) ||
  		!_.isUndefined(attrs['x-alignment']) ||
  		!_.isUndefined(attrs['y-alignment'])
                 ) {
  
                  relativelyPositioned.push($selected);
              }
              
          }, this);
  
          // We don't want the sub elements to affect the bounding box of the root element when
          // positioning the sub elements relatively to the bounding box.
          //_.invoke(relativelyPositioned, 'hide');
          //_.invoke(relativelyPositioned, 'show');
  
          // Note that we're using the bounding box without transformation because we are already inside
          // a transformed coordinate system.
          var bbox = this.el.getBBox();        
  
          renderingOnlyAttrs = renderingOnlyAttrs || {};
  
          _.each(relativelyPositioned, function($el) {
  
              // if there was a special attribute affecting the position amongst renderingOnlyAttributes
              // we have to merge it with rest of the element's attributes as they are necessary
              // to update the position relatively (i.e `ref`)
              var renderingOnlyElAttrs = renderingOnlyAttrs[$el.selector];
              var elAttrs = renderingOnlyElAttrs
                  ? _.merge({}, allAttrs[$el.selector], renderingOnlyElAttrs)
                  : allAttrs[$el.selector];
  
              this.positionRelative($el, bbox, elAttrs);
              
          }, this);
  
          if (rotatable) {
  
              rotatable.attr('transform', rotation || '');
          }
      }
func_documentation_string: Default is to process the `attrs` object and set attributes on subelements based on the selectors.