Add documentation for Node.
diff --git a/decode.go b/decode.go
index 5da762a..a5c637c 100644
--- a/decode.go
+++ b/decode.go
@@ -12,86 +12,6 @@
 	"time"
 )
 
-type NodeKind uint32
-
-const (
-	DocumentNode NodeKind = 1 << iota
-	SequenceNode
-	MappingNode
-	ScalarNode
-	AliasNode
-)
-
-type Style uint32
-
-const (
-	TaggedStyle Style = 1 << iota
-	DoubleQuotedStyle
-	SingleQuotedStyle
-	LiteralStyle
-	FoldedStyle
-	FlowStyle
-)
-
-type Node struct {
-	Kind     NodeKind
-	Style    Style
-	Line     int
-	Column   int
-	Tag      string
-	Value    string
-	Anchor   string
-	Alias    *Node
-	Children []*Node
-
-	HeadComment string
-	LineComment string
-	FootComment string
-}
-
-func (n *Node) LongTag() string {
-	return longTag(n.ShortTag())
-}
-
-func (n *Node) ShortTag() string {
-	if n.indicatedString() {
-		return strTag
-	}
-	if n.Tag == "" || n.Tag == "!" {
-		switch n.Kind {
-		case MappingNode:
-			return mapTag
-		case SequenceNode:
-			return seqTag
-		case AliasNode:
-			if n.Alias != nil {
-				return n.Alias.ShortTag()
-			}
-		case ScalarNode:
-			tag, _ := resolve("", n.Value)
-			return tag
-		}
-		return ""
-	}
-	return shortTag(n.Tag)
-}
-
-func (n *Node) indicatedString() bool {
-	return n.Kind == ScalarNode &&
-		(shortTag(n.Tag) == strTag ||
-			(n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0)
-}
-
-func (n *Node) SetString(s string) {
-	n.Kind = ScalarNode
-	n.Value = s
-	if strings.Contains(s, "\n") {
-		n.Style = LiteralStyle
-	} else if n.ShortTag() != strTag {
-		n.Style = DoubleQuotedStyle
-	}
-}
-
 // ----------------------------------------------------------------------------
 // Parser, produces a node tree out of a libyaml event stream.
 
diff --git a/yaml.go b/yaml.go
index 7489d0b..22726ad 100644
--- a/yaml.go
+++ b/yaml.go
@@ -282,6 +282,116 @@
 	return fmt.Sprintf("yaml: unmarshal errors:\n  %s", strings.Join(e.Errors, "\n  "))
 }
 
+
+type NodeKind uint32
+
+const (
+	DocumentNode NodeKind = 1 << iota
+	SequenceNode
+	MappingNode
+	ScalarNode
+	AliasNode
+)
+
+type Style uint32
+
+const (
+	TaggedStyle Style = 1 << iota
+	DoubleQuotedStyle
+	SingleQuotedStyle
+	LiteralStyle
+	FoldedStyle
+	FlowStyle
+)
+
+// Node represents an element in the yaml document hierarchy. While documents
+// are typically encoded and decoded into higher level types, such as structs
+// and maps, Node is an intermediate representation that allows detailed
+// control over the content being decoded or encoded. It may be used entirely
+// by itself, or composed together with other types. For example, it may be
+// used as the type of a single field of a structure being decoded.
+type Node struct {
+	Kind     NodeKind
+	Style    Style
+
+	// Line and Column hold the node position in the yaml text.
+	Line     int
+	Column   int
+
+	// Tag holds the yaml tag defining the data type for the value. On
+	// decoded values this field will always be set to the resolved tag,
+	// even when a tag wasn't explicitly provided in the yaml content.
+	// When encoding, if this field is unset the value type will be
+	// implied
+	Tag      string
+
+	// Value holds the unescaped and unquoted represenation of the value.
+	Value    string
+
+	// Anchor holds the anchor name for this node, which allows aliases to point to it. 
+	Anchor   string
+
+	// Alias holds the node that this alias points to. Only valid when Kind is AliasNode.
+	Alias    *Node
+
+	// Children holds contained nodes for documents, mappings, and sequences.
+	Children []*Node
+
+	// HeadComment holds any comments in the lines preceding the node and
+	// not separated by an empty line.
+	HeadComment string
+
+	// LineComment holds any comments at the end of the line where the node is in.
+	LineComment string
+
+	// FootComment holds any comments following the node and before empty lines.
+	FootComment string
+}
+
+func (n *Node) LongTag() string {
+	return longTag(n.ShortTag())
+}
+
+func (n *Node) ShortTag() string {
+	if n.indicatedString() {
+		return strTag
+	}
+	if n.Tag == "" || n.Tag == "!" {
+		switch n.Kind {
+		case MappingNode:
+			return mapTag
+		case SequenceNode:
+			return seqTag
+		case AliasNode:
+			if n.Alias != nil {
+				return n.Alias.ShortTag()
+			}
+		case ScalarNode:
+			tag, _ := resolve("", n.Value)
+			return tag
+		}
+		return ""
+	}
+	return shortTag(n.Tag)
+}
+
+func (n *Node) indicatedString() bool {
+	return n.Kind == ScalarNode &&
+		(shortTag(n.Tag) == strTag ||
+			(n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0)
+}
+
+func (n *Node) SetString(s string) {
+	n.Kind = ScalarNode
+	n.Value = s
+	if strings.Contains(s, "\n") {
+		n.Style = LiteralStyle
+	} else if n.ShortTag() != strTag {
+		n.Style = DoubleQuotedStyle
+	}
+}
+
+
 // --------------------------------------------------------------------------
 // Maintain a mapping of keys to structure field indexes