def updated(type=nil, children=nil, properties=nil)
      new_type       = type       || @type
      new_children   = children   || @children
      new_properties = properties || {}

      if @type == new_type &&
          @children == new_children &&
          properties.nil?
        self
      else
        original_dup.send :initialize, new_type, new_children, new_properties
      end
    end
def updated(type=nil, children=nil, properties=nil)
      new_type       = type       || @type
      new_children   = children   || @children
      new_properties = properties || {}

      if @type == new_type &&
          @children == new_children &&
          properties.nil?
        self
      else
        original_dup.send :initialize, new_type, new_children, new_properties
      end
    end
Returns a new instance of Node where non-nil arguments replace the
 corresponding fields of `self`.

 For example, `Node.new(:foo, [ 1, 2 ]).updated(:bar)` would yield
 `(bar 1 2)`, and `Node.new(:foo, [ 1, 2 ]).updated(nil, [])` would
 yield `(foo)`.

 If the resulting node would be identical to `self`, does nothing.

 @param  [Symbol, nil] type
 @param  [Array, nil]  children
 @param  [Hash, nil]   properties
 @return [AST::Node]