code: function(obj) {
              // instantiate new node
              var className = this.getClassName(),
                  attrs = Kinetic.Util.cloneObject(this.attrs),
                  key, allListeners, len, n, listener;
              // filter black attrs
              for (var i in CLONE_BLACK_LIST) {
                  var blockAttr = CLONE_BLACK_LIST[i];
                  delete attrs[blockAttr];
              }
              // apply attr overrides
              for (key in obj) {
                  attrs[key] = obj[key];
              }
  
              var node = new Kinetic[className](attrs);
              // copy over listeners
              for(key in this.eventListeners) {
                  allListeners = this.eventListeners[key];
                  len = allListeners.length;
                  for(n = 0; n < len; n++) {
                      listener = allListeners[n];
                      /*
                       * don't include kinetic namespaced listeners because
                       *  these are generated by the constructors
                       */
                      if(listener.name.indexOf(KINETIC) < 0) {
                          // if listeners array doesn't exist, then create it
                          if(!node.eventListeners[key]) {
                              node.eventListeners[key] = [];
                          }
                          node.eventListeners[key].push(listener);
                      }
                  }
              }
              return node;
          }
docs: clone node.  Returns a new Node instance with identical attributes.  You can also override
  the node properties with an object literal, enabling you to use an existing node as a template
  for another node
  @method
  @memberof Kinetic.Node.prototype
  @param {Object} attrs override attrs
  @returns {Kinetic.Node}
  @example
  // simple clone<br>
  var clone = node.clone();<br><br>
  
  // clone a node and override the x position<br>
  var clone = rect.clone({<br>
  x: 5<br>
  });