diff --git a/Makefile b/Makefile
index ff7b1a4..507f607 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@
 	writer.o\
 	emitter.o\
 
-GOFMT=gofmt -spaces=true -tabwidth=4 -tabindent=false
+GOFMT=gofmt
 
 BADFMT:=$(shell $(GOFMT) -l $(GOFILES) $(CGOFILES) $(wildcard *_test.go))
 
diff --git a/decode.go b/decode.go
index e8da5dd..9db4102 100644
--- a/decode.go
+++ b/decode.go
@@ -7,31 +7,31 @@
 import "C"
 
 import (
-    "unsafe"
-    "reflect"
-    "strconv"
+	"unsafe"
+	"reflect"
+	"strconv"
 )
 
 const (
-    documentNode = 1 << iota
-    mappingNode
-    sequenceNode
-    scalarNode
-    aliasNode
+	documentNode = 1 << iota
+	mappingNode
+	sequenceNode
+	scalarNode
+	aliasNode
 )
 
 type node struct {
-    kind         int
-    line, column int
-    tag          string
-    value        string
-    implicit     bool
-    children     []*node
-    anchors      map[string]*node
+	kind         int
+	line, column int
+	tag          string
+	value        string
+	implicit     bool
+	children     []*node
+	anchors      map[string]*node
 }
 
 func stry(s *C.yaml_char_t) string {
-    return C.GoString((*C.char)(unsafe.Pointer(s)))
+	return C.GoString((*C.char)(unsafe.Pointer(s)))
 }
 
 
@@ -39,161 +39,161 @@
 // Parser, produces a node tree out of a libyaml event stream.
 
 type parser struct {
-    parser C.yaml_parser_t
-    event  C.yaml_event_t
-    doc    *node
+	parser C.yaml_parser_t
+	event  C.yaml_event_t
+	doc    *node
 }
 
 func newParser(b []byte) *parser {
-    p := parser{}
-    if C.yaml_parser_initialize(&p.parser) == 0 {
-        panic("Failed to initialize YAML emitter")
-    }
+	p := parser{}
+	if C.yaml_parser_initialize(&p.parser) == 0 {
+		panic("Failed to initialize YAML emitter")
+	}
 
-    if len(b) == 0 {
-        b = []byte{'\n'}
-    }
+	if len(b) == 0 {
+		b = []byte{'\n'}
+	}
 
-    // How unsafe is this really?  Will this break if the GC becomes compacting?
-    // Probably not, otherwise that would likely break &parse below as well.
-    input := (*C.uchar)(unsafe.Pointer(&b[0]))
-    C.yaml_parser_set_input_string(&p.parser, input, (C.size_t)(len(b)))
+	// How unsafe is this really?  Will this break if the GC becomes compacting?
+	// Probably not, otherwise that would likely break &parse below as well.
+	input := (*C.uchar)(unsafe.Pointer(&b[0]))
+	C.yaml_parser_set_input_string(&p.parser, input, (C.size_t)(len(b)))
 
-    p.skip()
-    if p.event._type != C.YAML_STREAM_START_EVENT {
-        panic("Expected stream start event, got " +
-            strconv.Itoa(int(p.event._type)))
-    }
-    p.skip()
-    return &p
+	p.skip()
+	if p.event._type != C.YAML_STREAM_START_EVENT {
+		panic("Expected stream start event, got " +
+			strconv.Itoa(int(p.event._type)))
+	}
+	p.skip()
+	return &p
 }
 
 func (p *parser) destroy() {
-    if p.event._type != C.YAML_NO_EVENT {
-        C.yaml_event_delete(&p.event)
-    }
-    C.yaml_parser_delete(&p.parser)
+	if p.event._type != C.YAML_NO_EVENT {
+		C.yaml_event_delete(&p.event)
+	}
+	C.yaml_parser_delete(&p.parser)
 }
 
 func (p *parser) skip() {
-    if p.event._type != C.YAML_NO_EVENT {
-        if p.event._type == C.YAML_STREAM_END_EVENT {
-            panic("Attempted to go past the end of stream. Corrupted value?")
-        }
-        C.yaml_event_delete(&p.event)
-    }
-    if C.yaml_parser_parse(&p.parser, &p.event) == 0 {
-        p.fail()
-    }
+	if p.event._type != C.YAML_NO_EVENT {
+		if p.event._type == C.YAML_STREAM_END_EVENT {
+			panic("Attempted to go past the end of stream. Corrupted value?")
+		}
+		C.yaml_event_delete(&p.event)
+	}
+	if C.yaml_parser_parse(&p.parser, &p.event) == 0 {
+		p.fail()
+	}
 }
 
 func (p *parser) fail() {
-    var where string
-    var line int
-    if p.parser.problem_mark.line != 0 {
-        line = int(C.int(p.parser.problem_mark.line))
-    } else if p.parser.context_mark.line != 0 {
-        line = int(C.int(p.parser.context_mark.line))
-    }
-    if line != 0 {
-        where = "line " + strconv.Itoa(line) + ": "
-    }
-    var msg string
-    if p.parser.problem != nil {
-        msg = C.GoString(p.parser.problem)
-    } else {
-        msg = "Unknown problem parsing YAML content"
-    }
-    panic(where + msg)
+	var where string
+	var line int
+	if p.parser.problem_mark.line != 0 {
+		line = int(C.int(p.parser.problem_mark.line))
+	} else if p.parser.context_mark.line != 0 {
+		line = int(C.int(p.parser.context_mark.line))
+	}
+	if line != 0 {
+		where = "line " + strconv.Itoa(line) + ": "
+	}
+	var msg string
+	if p.parser.problem != nil {
+		msg = C.GoString(p.parser.problem)
+	} else {
+		msg = "Unknown problem parsing YAML content"
+	}
+	panic(where + msg)
 }
 
 func (p *parser) anchor(n *node, anchor *C.yaml_char_t) {
-    if anchor != nil {
-        p.doc.anchors[stry(anchor)] = n
-    }
+	if anchor != nil {
+		p.doc.anchors[stry(anchor)] = n
+	}
 }
 
 func (p *parser) parse() *node {
-    switch p.event._type {
-    case C.YAML_SCALAR_EVENT:
-        return p.scalar()
-    case C.YAML_ALIAS_EVENT:
-        return p.alias()
-    case C.YAML_MAPPING_START_EVENT:
-        return p.mapping()
-    case C.YAML_SEQUENCE_START_EVENT:
-        return p.sequence()
-    case C.YAML_DOCUMENT_START_EVENT:
-        return p.document()
-    case C.YAML_STREAM_END_EVENT:
-        // Happens when attempting to decode an empty buffer.
-        return nil
-    default:
-        panic("Attempted to parse unknown event: " +
-            strconv.Itoa(int(p.event._type)))
-    }
-    panic("Unreachable")
+	switch p.event._type {
+	case C.YAML_SCALAR_EVENT:
+		return p.scalar()
+	case C.YAML_ALIAS_EVENT:
+		return p.alias()
+	case C.YAML_MAPPING_START_EVENT:
+		return p.mapping()
+	case C.YAML_SEQUENCE_START_EVENT:
+		return p.sequence()
+	case C.YAML_DOCUMENT_START_EVENT:
+		return p.document()
+	case C.YAML_STREAM_END_EVENT:
+		// Happens when attempting to decode an empty buffer.
+		return nil
+	default:
+		panic("Attempted to parse unknown event: " +
+			strconv.Itoa(int(p.event._type)))
+	}
+	panic("Unreachable")
 }
 
 func (p *parser) node(kind int) *node {
-    return &node{kind: kind,
-        line:   int(C.int(p.event.start_mark.line)),
-        column: int(C.int(p.event.start_mark.column))}
+	return &node{kind: kind,
+		line:   int(C.int(p.event.start_mark.line)),
+		column: int(C.int(p.event.start_mark.column))}
 }
 
 func (p *parser) document() *node {
-    n := p.node(documentNode)
-    n.anchors = make(map[string]*node)
-    p.doc = n
-    p.skip()
-    n.children = append(n.children, p.parse())
-    if p.event._type != C.YAML_DOCUMENT_END_EVENT {
-        panic("Expected end of document event but got " +
-            strconv.Itoa(int(p.event._type)))
-    }
-    p.skip()
-    return n
+	n := p.node(documentNode)
+	n.anchors = make(map[string]*node)
+	p.doc = n
+	p.skip()
+	n.children = append(n.children, p.parse())
+	if p.event._type != C.YAML_DOCUMENT_END_EVENT {
+		panic("Expected end of document event but got " +
+			strconv.Itoa(int(p.event._type)))
+	}
+	p.skip()
+	return n
 }
 
 func (p *parser) alias() *node {
-    alias := C.event_alias(&p.event)
-    n := p.node(aliasNode)
-    n.value = stry(alias.anchor)
-    p.skip()
-    return n
+	alias := C.event_alias(&p.event)
+	n := p.node(aliasNode)
+	n.value = stry(alias.anchor)
+	p.skip()
+	return n
 }
 
 func (p *parser) scalar() *node {
-    scalar := C.event_scalar(&p.event)
-    n := p.node(scalarNode)
-    n.value = stry(scalar.value)
-    n.tag = stry(scalar.tag)
-    n.implicit = (scalar.plain_implicit != 0)
-    p.anchor(n, scalar.anchor)
-    p.skip()
-    return n
+	scalar := C.event_scalar(&p.event)
+	n := p.node(scalarNode)
+	n.value = stry(scalar.value)
+	n.tag = stry(scalar.tag)
+	n.implicit = (scalar.plain_implicit != 0)
+	p.anchor(n, scalar.anchor)
+	p.skip()
+	return n
 }
 
 func (p *parser) sequence() *node {
-    n := p.node(sequenceNode)
-    p.anchor(n, C.event_sequence_start(&p.event).anchor)
-    p.skip()
-    for p.event._type != C.YAML_SEQUENCE_END_EVENT {
-        n.children = append(n.children, p.parse())
-    }
-    p.skip()
-    return n
+	n := p.node(sequenceNode)
+	p.anchor(n, C.event_sequence_start(&p.event).anchor)
+	p.skip()
+	for p.event._type != C.YAML_SEQUENCE_END_EVENT {
+		n.children = append(n.children, p.parse())
+	}
+	p.skip()
+	return n
 }
 
 func (p *parser) mapping() *node {
-    n := p.node(mappingNode)
-    p.anchor(n, C.event_mapping_start(&p.event).anchor)
-    p.skip()
-    for p.event._type != C.YAML_MAPPING_END_EVENT {
-        n.children = append(n.children, p.parse(), p.parse())
-    }
-    p.skip()
-    return n
+	n := p.node(mappingNode)
+	p.anchor(n, C.event_mapping_start(&p.event).anchor)
+	p.skip()
+	for p.event._type != C.YAML_MAPPING_END_EVENT {
+		n.children = append(n.children, p.parse(), p.parse())
+	}
+	p.skip()
+	return n
 }
 
 
@@ -201,14 +201,14 @@
 // Decoder, unmarshals a node into a provided value.
 
 type decoder struct {
-    doc     *node
-    aliases map[string]bool
+	doc     *node
+	aliases map[string]bool
 }
 
 func newDecoder() *decoder {
-    d := &decoder{}
-    d.aliases = make(map[string]bool)
-    return d
+	d := &decoder{}
+	d.aliases = make(map[string]bool)
+	return d
 }
 
 // d.setter deals with setters and pointer dereferencing and initialization.
@@ -228,219 +228,219 @@
 //   returned to call SetYAML() with the value of *out once it's defined.
 //
 func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()) {
-    again := true
-    for again {
-        again = false
-        setter, _ := (*out).Interface().(Setter)
-        if tag != "!!null" || setter != nil {
-            if pv, ok := (*out).(*reflect.PtrValue); ok {
-                if pv.IsNil() {
-                    *out = reflect.MakeZero(pv.Type().(*reflect.PtrType).Elem())
-                    pv.PointTo(*out)
-                } else {
-                    *out = pv.Elem()
-                }
-                setter, _ = pv.Interface().(Setter)
-                again = true
-            }
-        }
-        if setter != nil {
-            var arg interface{}
-            *out = reflect.NewValue(&arg).(*reflect.PtrValue).Elem()
-            return func() {
-                *good = setter.SetYAML(tag, arg)
-            }
-        }
-    }
-    return nil
+	again := true
+	for again {
+		again = false
+		setter, _ := (*out).Interface().(Setter)
+		if tag != "!!null" || setter != nil {
+			if pv, ok := (*out).(*reflect.PtrValue); ok {
+				if pv.IsNil() {
+					*out = reflect.MakeZero(pv.Type().(*reflect.PtrType).Elem())
+					pv.PointTo(*out)
+				} else {
+					*out = pv.Elem()
+				}
+				setter, _ = pv.Interface().(Setter)
+				again = true
+			}
+		}
+		if setter != nil {
+			var arg interface{}
+			*out = reflect.NewValue(&arg).(*reflect.PtrValue).Elem()
+			return func() {
+				*good = setter.SetYAML(tag, arg)
+			}
+		}
+	}
+	return nil
 }
 
 func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
-    switch n.kind {
-    case documentNode:
-        good = d.document(n, out)
-    case scalarNode:
-        good = d.scalar(n, out)
-    case aliasNode:
-        good = d.alias(n, out)
-    case mappingNode:
-        good = d.mapping(n, out)
-    case sequenceNode:
-        good = d.sequence(n, out)
-    default:
-        panic("Internal error: unknown node kind: " + strconv.Itoa(n.kind))
-    }
-    return
+	switch n.kind {
+	case documentNode:
+		good = d.document(n, out)
+	case scalarNode:
+		good = d.scalar(n, out)
+	case aliasNode:
+		good = d.alias(n, out)
+	case mappingNode:
+		good = d.mapping(n, out)
+	case sequenceNode:
+		good = d.sequence(n, out)
+	default:
+		panic("Internal error: unknown node kind: " + strconv.Itoa(n.kind))
+	}
+	return
 }
 
 func (d *decoder) document(n *node, out reflect.Value) (good bool) {
-    if len(n.children) == 1 {
-        d.doc = n
-        d.unmarshal(n.children[0], out)
-        return true
-    }
-    return false
+	if len(n.children) == 1 {
+		d.doc = n
+		d.unmarshal(n.children[0], out)
+		return true
+	}
+	return false
 }
 
 func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
-    an, ok := d.doc.anchors[n.value]
-    if !ok {
-        panic("Unknown anchor '" + n.value + "' referenced")
-    }
-    if d.aliases[n.value] {
-        panic("Anchor '" + n.value + "' value contains itself")
-    }
-    d.aliases[n.value] = true
-    good = d.unmarshal(an, out)
-    d.aliases[n.value] = false, false
-    return good
+	an, ok := d.doc.anchors[n.value]
+	if !ok {
+		panic("Unknown anchor '" + n.value + "' referenced")
+	}
+	if d.aliases[n.value] {
+		panic("Anchor '" + n.value + "' value contains itself")
+	}
+	d.aliases[n.value] = true
+	good = d.unmarshal(an, out)
+	d.aliases[n.value] = false, false
+	return good
 }
 
 func (d *decoder) scalar(n *node, out reflect.Value) (good bool) {
-    var tag string
-    var resolved interface{}
-    if n.tag == "" && !n.implicit {
-        resolved = n.value
-    } else {
-        tag, resolved = resolve(n.tag, n.value)
-        if set := d.setter(tag, &out, &good); set != nil {
-            defer set()
-        }
-    }
-    switch out := out.(type) {
-    case *reflect.StringValue:
-        out.Set(n.value)
-        good = true
-    case *reflect.InterfaceValue:
-        out.Set(reflect.NewValue(resolved))
-        good = true
-    case *reflect.IntValue:
-        switch resolved := resolved.(type) {
-        case int:
-            if !out.Overflow(int64(resolved)) {
-                out.Set(int64(resolved))
-                good = true
-            }
-        case int64:
-            if !out.Overflow(resolved) {
-                out.Set(resolved)
-                good = true
-            }
-        }
-    case *reflect.UintValue:
-        switch resolved := resolved.(type) {
-        case int:
-            if resolved >= 0 {
-                out.Set(uint64(resolved))
-                good = true
-            }
-        case int64:
-            if resolved >= 0 {
-                out.Set(uint64(resolved))
-                good = true
-            }
-        }
-    case *reflect.BoolValue:
-        switch resolved := resolved.(type) {
-        case bool:
-            out.Set(resolved)
-            good = true
-        }
-    case *reflect.FloatValue:
-        switch resolved := resolved.(type) {
-        case float64:
-            out.Set(resolved)
-            good = true
-        }
-    case *reflect.PtrValue:
-        switch resolved := resolved.(type) {
-        case nil:
-            out.PointTo(nil)
-            good = true
-        }
-    default:
-        panic("Can't handle type yet: " + out.Type().String())
-    }
-    return good
+	var tag string
+	var resolved interface{}
+	if n.tag == "" && !n.implicit {
+		resolved = n.value
+	} else {
+		tag, resolved = resolve(n.tag, n.value)
+		if set := d.setter(tag, &out, &good); set != nil {
+			defer set()
+		}
+	}
+	switch out := out.(type) {
+	case *reflect.StringValue:
+		out.Set(n.value)
+		good = true
+	case *reflect.InterfaceValue:
+		out.Set(reflect.NewValue(resolved))
+		good = true
+	case *reflect.IntValue:
+		switch resolved := resolved.(type) {
+		case int:
+			if !out.Overflow(int64(resolved)) {
+				out.Set(int64(resolved))
+				good = true
+			}
+		case int64:
+			if !out.Overflow(resolved) {
+				out.Set(resolved)
+				good = true
+			}
+		}
+	case *reflect.UintValue:
+		switch resolved := resolved.(type) {
+		case int:
+			if resolved >= 0 {
+				out.Set(uint64(resolved))
+				good = true
+			}
+		case int64:
+			if resolved >= 0 {
+				out.Set(uint64(resolved))
+				good = true
+			}
+		}
+	case *reflect.BoolValue:
+		switch resolved := resolved.(type) {
+		case bool:
+			out.Set(resolved)
+			good = true
+		}
+	case *reflect.FloatValue:
+		switch resolved := resolved.(type) {
+		case float64:
+			out.Set(resolved)
+			good = true
+		}
+	case *reflect.PtrValue:
+		switch resolved := resolved.(type) {
+		case nil:
+			out.PointTo(nil)
+			good = true
+		}
+	default:
+		panic("Can't handle type yet: " + out.Type().String())
+	}
+	return good
 }
 
 func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
-    if set := d.setter("!!seq", &out, &good); set != nil {
-        defer set()
-    }
-    if iface, ok := out.(*reflect.InterfaceValue); ok {
-        // No type hints. Will have to use a generic sequence.
-        out = reflect.NewValue(make([]interface{}, 0))
-        iface.SetValue(out)
-    }
+	if set := d.setter("!!seq", &out, &good); set != nil {
+		defer set()
+	}
+	if iface, ok := out.(*reflect.InterfaceValue); ok {
+		// No type hints. Will have to use a generic sequence.
+		out = reflect.NewValue(make([]interface{}, 0))
+		iface.SetValue(out)
+	}
 
-    sv, ok := out.(*reflect.SliceValue)
-    if !ok {
-        return false
-    }
-    st := sv.Type().(*reflect.SliceType)
-    et := st.Elem()
+	sv, ok := out.(*reflect.SliceValue)
+	if !ok {
+		return false
+	}
+	st := sv.Type().(*reflect.SliceType)
+	et := st.Elem()
 
-    l := len(n.children)
-    for i := 0; i < l; i++ {
-        e := reflect.MakeZero(et)
-        if ok := d.unmarshal(n.children[i], e); ok {
-            sv.SetValue(reflect.Append(sv, e))
-        }
-    }
-    return true
+	l := len(n.children)
+	for i := 0; i < l; i++ {
+		e := reflect.MakeZero(et)
+		if ok := d.unmarshal(n.children[i], e); ok {
+			sv.SetValue(reflect.Append(sv, e))
+		}
+	}
+	return true
 }
 
 func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
-    if set := d.setter("!!map", &out, &good); set != nil {
-        defer set()
-    }
-    if s, ok := out.(*reflect.StructValue); ok {
-        return d.mappingStruct(n, s)
-    }
+	if set := d.setter("!!map", &out, &good); set != nil {
+		defer set()
+	}
+	if s, ok := out.(*reflect.StructValue); ok {
+		return d.mappingStruct(n, s)
+	}
 
-    if iface, ok := out.(*reflect.InterfaceValue); ok {
-        // No type hints. Will have to use a generic map.
-        out = reflect.NewValue(make(map[interface{}]interface{}))
-        iface.SetValue(out)
-    }
+	if iface, ok := out.(*reflect.InterfaceValue); ok {
+		// No type hints. Will have to use a generic map.
+		out = reflect.NewValue(make(map[interface{}]interface{}))
+		iface.SetValue(out)
+	}
 
-    mv, ok := out.(*reflect.MapValue)
-    if !ok {
-        return false
-    }
-    mt := mv.Type().(*reflect.MapType)
-    kt := mt.Key()
-    et := mt.Elem()
+	mv, ok := out.(*reflect.MapValue)
+	if !ok {
+		return false
+	}
+	mt := mv.Type().(*reflect.MapType)
+	kt := mt.Key()
+	et := mt.Elem()
 
-    l := len(n.children)
-    for i := 0; i < l; i += 2 {
-        k := reflect.MakeZero(kt)
-        if d.unmarshal(n.children[i], k) {
-            e := reflect.MakeZero(et)
-            if d.unmarshal(n.children[i+1], e) {
-                mv.SetElem(k, e)
-            }
-        }
-    }
-    return true
+	l := len(n.children)
+	for i := 0; i < l; i += 2 {
+		k := reflect.MakeZero(kt)
+		if d.unmarshal(n.children[i], k) {
+			e := reflect.MakeZero(et)
+			if d.unmarshal(n.children[i+1], e) {
+				mv.SetElem(k, e)
+			}
+		}
+	}
+	return true
 }
 
 func (d *decoder) mappingStruct(n *node, out *reflect.StructValue) (good bool) {
-    fields, err := getStructFields(out.Type().(*reflect.StructType))
-    if err != nil {
-        panic(err)
-    }
-    name := reflect.NewValue("").(*reflect.StringValue)
-    fieldsMap := fields.Map
-    l := len(n.children)
-    for i := 0; i < l; i += 2 {
-        if !d.unmarshal(n.children[i], name) {
-            continue
-        }
-        if info, ok := fieldsMap[name.Get()]; ok {
-            d.unmarshal(n.children[i+1], out.Field(info.Num))
-        }
-    }
-    return true
+	fields, err := getStructFields(out.Type().(*reflect.StructType))
+	if err != nil {
+		panic(err)
+	}
+	name := reflect.NewValue("").(*reflect.StringValue)
+	fieldsMap := fields.Map
+	l := len(n.children)
+	for i := 0; i < l; i += 2 {
+		if !d.unmarshal(n.children[i], name) {
+			continue
+		}
+		if info, ok := fieldsMap[name.Get()]; ok {
+			d.unmarshal(n.children[i+1], out.Field(info.Num))
+		}
+	}
+	return true
 }
diff --git a/decode_test.go b/decode_test.go
index aca12ca..5fdf2b4 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -2,245 +2,245 @@
 
 
 import (
-    .   "gocheck"
-    "goyaml"
-    "reflect"
-    "math"
+	. "launchpad.net/gocheck"
+	"goyaml"
+	"reflect"
+	"math"
 )
 
 
 var unmarshalIntTest = 123
 
 var unmarshalTests = []struct {
-    data  string
-    value interface{}
+	data  string
+	value interface{}
 }{
-    {"", &struct{}{}},
-    {"{}", &struct{}{}},
+	{"", &struct{}{}},
+	{"{}", &struct{}{}},
 
-    {"v: hi", map[string]string{"v": "hi"}},
-    {"v: hi", map[string]interface{}{"v": "hi"}},
-    {"v: true", map[string]string{"v": "true"}},
-    {"v: true", map[string]interface{}{"v": true}},
-    {"v: 10", map[string]interface{}{"v": 10}},
-    {"v: 0b10", map[string]interface{}{"v": 2}},
-    {"v: 0xA", map[string]interface{}{"v": 10}},
-    {"v: 4294967296", map[string]interface{}{"v": int64(4294967296)}},
-    {"v: 4294967296", map[string]int64{"v": int64(4294967296)}},
-    {"v: 0.1", map[string]interface{}{"v": 0.1}},
-    {"v: .1", map[string]interface{}{"v": 0.1}},
-    {"v: .Inf", map[string]interface{}{"v": math.Inf(+1)}},
-    {"v: -.Inf", map[string]interface{}{"v": math.Inf(-1)}},
-    {"v: -10", map[string]interface{}{"v": -10}},
-    {"v: -.1", map[string]interface{}{"v": -0.1}},
+	{"v: hi", map[string]string{"v": "hi"}},
+	{"v: hi", map[string]interface{}{"v": "hi"}},
+	{"v: true", map[string]string{"v": "true"}},
+	{"v: true", map[string]interface{}{"v": true}},
+	{"v: 10", map[string]interface{}{"v": 10}},
+	{"v: 0b10", map[string]interface{}{"v": 2}},
+	{"v: 0xA", map[string]interface{}{"v": 10}},
+	{"v: 4294967296", map[string]interface{}{"v": int64(4294967296)}},
+	{"v: 4294967296", map[string]int64{"v": int64(4294967296)}},
+	{"v: 0.1", map[string]interface{}{"v": 0.1}},
+	{"v: .1", map[string]interface{}{"v": 0.1}},
+	{"v: .Inf", map[string]interface{}{"v": math.Inf(+1)}},
+	{"v: -.Inf", map[string]interface{}{"v": math.Inf(-1)}},
+	{"v: -10", map[string]interface{}{"v": -10}},
+	{"v: -.1", map[string]interface{}{"v": -0.1}},
 
-    // Simple values.
-    {"123", &unmarshalIntTest},
+	// Simple values.
+	{"123", &unmarshalIntTest},
 
-    // Floats from spec
-    {"canonical: 6.8523e+5", map[string]interface{}{"canonical": 6.8523e+5}},
-    {"expo: 685.230_15e+03", map[string]interface{}{"expo": 685.23015e+03}},
-    {"fixed: 685_230.15", map[string]interface{}{"fixed": 685230.15}},
-    //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
-    {"neginf: -.inf", map[string]interface{}{"neginf": math.Inf(-1)}},
-    {"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}},
-    {"fixed: 685_230.15", map[string]float64{"fixed": 685230.15}},
+	// Floats from spec
+	{"canonical: 6.8523e+5", map[string]interface{}{"canonical": 6.8523e+5}},
+	{"expo: 685.230_15e+03", map[string]interface{}{"expo": 685.23015e+03}},
+	{"fixed: 685_230.15", map[string]interface{}{"fixed": 685230.15}},
+	//{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
+	{"neginf: -.inf", map[string]interface{}{"neginf": math.Inf(-1)}},
+	{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}},
+	{"fixed: 685_230.15", map[string]float64{"fixed": 685230.15}},
 
-    // Bools from spec
-    {"canonical: y", map[string]interface{}{"canonical": true}},
-    {"answer: NO", map[string]interface{}{"answer": false}},
-    {"logical: True", map[string]interface{}{"logical": true}},
-    {"option: on", map[string]interface{}{"option": true}},
-    {"option: on", map[string]bool{"option": true}},
+	// Bools from spec
+	{"canonical: y", map[string]interface{}{"canonical": true}},
+	{"answer: NO", map[string]interface{}{"answer": false}},
+	{"logical: True", map[string]interface{}{"logical": true}},
+	{"option: on", map[string]interface{}{"option": true}},
+	{"option: on", map[string]bool{"option": true}},
 
-    // Ints from spec
-    {"canonical: 685230", map[string]interface{}{"canonical": 685230}},
-    {"decimal: +685_230", map[string]interface{}{"decimal": 685230}},
-    {"octal: 02472256", map[string]interface{}{"octal": 685230}},
-    {"hexa: 0x_0A_74_AE", map[string]interface{}{"hexa": 685230}},
-    {"bin: 0b1010_0111_0100_1010_1110", map[string]interface{}{"bin": 685230}},
-    {"bin: -0b101010", map[string]interface{}{"bin": -42}},
-    //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
-    {"decimal: +685_230", map[string]int{"decimal": 685230}},
+	// Ints from spec
+	{"canonical: 685230", map[string]interface{}{"canonical": 685230}},
+	{"decimal: +685_230", map[string]interface{}{"decimal": 685230}},
+	{"octal: 02472256", map[string]interface{}{"octal": 685230}},
+	{"hexa: 0x_0A_74_AE", map[string]interface{}{"hexa": 685230}},
+	{"bin: 0b1010_0111_0100_1010_1110", map[string]interface{}{"bin": 685230}},
+	{"bin: -0b101010", map[string]interface{}{"bin": -42}},
+	//{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
+	{"decimal: +685_230", map[string]int{"decimal": 685230}},
 
-    // Nulls from spec
-    {"empty:", map[string]interface{}{"empty": nil}},
-    {"canonical: ~", map[string]interface{}{"canonical": nil}},
-    {"english: null", map[string]interface{}{"english": nil}},
-    {"~: null key", map[interface{}]string{nil: "null key"}},
-    {"empty:", map[string]*bool{"empty": nil}},
+	// Nulls from spec
+	{"empty:", map[string]interface{}{"empty": nil}},
+	{"canonical: ~", map[string]interface{}{"canonical": nil}},
+	{"english: null", map[string]interface{}{"english": nil}},
+	{"~: null key", map[interface{}]string{nil: "null key"}},
+	{"empty:", map[string]*bool{"empty": nil}},
 
-    // Sequence
-    {"seq: [A,B]", map[string]interface{}{"seq": []interface{}{"A", "B"}}},
-    {"seq: [A,B,C]", map[string][]string{"seq": []string{"A", "B", "C"}}},
-    {"seq: [A,1,C]", map[string][]string{"seq": []string{"A", "1", "C"}}},
-    {"seq: [A,1,C]", map[string][]int{"seq": []int{1}}},
-    {"seq: [A,1,C]", map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}},
+	// Sequence
+	{"seq: [A,B]", map[string]interface{}{"seq": []interface{}{"A", "B"}}},
+	{"seq: [A,B,C]", map[string][]string{"seq": []string{"A", "B", "C"}}},
+	{"seq: [A,1,C]", map[string][]string{"seq": []string{"A", "1", "C"}}},
+	{"seq: [A,1,C]", map[string][]int{"seq": []int{1}}},
+	{"seq: [A,1,C]", map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}},
 
-    // Map inside interface with no type hints.
-    {"a: {b: c}",
-        map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}},
+	// Map inside interface with no type hints.
+	{"a: {b: c}",
+		map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}},
 
-    // Structs and type conversions.
-    {"hello: world", &struct{ Hello string }{"world"}},
-    {"a: {b: c}", &struct {
-        A struct {
-            B string
-        }
-    }{struct{ B string }{"c"}}},
-    {"a: {b: c}", &struct {
-        A *struct {
-            B string
-        }
-    }{&struct{ B string }{"c"}}},
-    {"a: 1", &struct{ A int }{1}},
-    {"a: [1, 2]", &struct{ A []int }{[]int{1, 2}}},
-    {"a: 1", &struct{ B int }{0}},
-    {"a: 1", &struct {
-        B int "a"
-    }{1}},
-    {"a: y", &struct{ A bool }{true}},
+	// Structs and type conversions.
+	{"hello: world", &struct{ Hello string }{"world"}},
+	{"a: {b: c}", &struct {
+		A struct {
+			B string
+		}
+	}{struct{ B string }{"c"}}},
+	{"a: {b: c}", &struct {
+		A *struct {
+			B string
+		}
+	}{&struct{ B string }{"c"}}},
+	{"a: 1", &struct{ A int }{1}},
+	{"a: [1, 2]", &struct{ A []int }{[]int{1, 2}}},
+	{"a: 1", &struct{ B int }{0}},
+	{"a: 1", &struct {
+		B int "a"
+	}{1}},
+	{"a: y", &struct{ A bool }{true}},
 
-    // Some cross type conversions
-    {"v: 42", map[string]uint{"v": 42}},
-    {"v: -42", map[string]uint{}},
-    {"v: 4294967296", map[string]uint64{"v": 4294967296}},
-    {"v: -4294967296", map[string]uint64{}},
+	// Some cross type conversions
+	{"v: 42", map[string]uint{"v": 42}},
+	{"v: -42", map[string]uint{}},
+	{"v: 4294967296", map[string]uint64{"v": 4294967296}},
+	{"v: -4294967296", map[string]uint64{}},
 
-    // Overflow cases.
-    {"v: 4294967297", map[string]int32{}},
-    {"v: 128", map[string]int8{}},
+	// Overflow cases.
+	{"v: 4294967297", map[string]int32{}},
+	{"v: 128", map[string]int8{}},
 
-    // Quoted values.
-    {"'1': '\"2\"'", map[interface{}]interface{}{"1": "\"2\""}},
+	// Quoted values.
+	{"'1': '\"2\"'", map[interface{}]interface{}{"1": "\"2\""}},
 
-    // Explicit tags.
-    {"v: !!float '1.1'", map[string]interface{}{"v": 1.1}},
-    {"v: !!null ''", map[string]interface{}{"v": nil}},
-    {"%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
-        map[string]interface{}{"v": 1}},
+	// Explicit tags.
+	{"v: !!float '1.1'", map[string]interface{}{"v": 1.1}},
+	{"v: !!null ''", map[string]interface{}{"v": nil}},
+	{"%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
+		map[string]interface{}{"v": 1}},
 
-    // Anchors and aliases.
-    {"a: &x 1\nb: &y 2\nc: *x\nd: *y\n", &struct{ A, B, C, D int }{1, 2, 1, 2}},
-    {"a: &a {c: 1}\nb: *a",
-        &struct {
-            A, B struct {
-                C int
-            }
-        }{struct{ C int }{1}, struct{ C int }{1}}},
-    {"a: &a [1, 2]\nb: *a", &struct{ B []int }{[]int{1, 2}}},
+	// Anchors and aliases.
+	{"a: &x 1\nb: &y 2\nc: *x\nd: *y\n", &struct{ A, B, C, D int }{1, 2, 1, 2}},
+	{"a: &a {c: 1}\nb: *a",
+		&struct {
+			A, B struct {
+				C int
+			}
+		}{struct{ C int }{1}, struct{ C int }{1}}},
+	{"a: &a [1, 2]\nb: *a", &struct{ B []int }{[]int{1, 2}}},
 }
 
 
 func (s *S) TestUnmarshal(c *C) {
-    for _, item := range unmarshalTests {
-        t := reflect.NewValue(item.value).Type()
-        var value interface{}
-        if t, ok := t.(*reflect.MapType); ok {
-            value = reflect.MakeMap(t).Interface()
-        } else {
-            pt := reflect.NewValue(item.value).Type().(*reflect.PtrType)
-            pv := reflect.MakeZero(pt).(*reflect.PtrValue)
-            pv.PointTo(reflect.MakeZero(pt.Elem()))
-            value = pv.Interface()
-        }
-        err := goyaml.Unmarshal([]byte(item.data), value)
-        c.Assert(err, IsNil)
-        c.Assert(value, Equals, item.value)
-    }
+	for _, item := range unmarshalTests {
+		t := reflect.NewValue(item.value).Type()
+		var value interface{}
+		if t, ok := t.(*reflect.MapType); ok {
+			value = reflect.MakeMap(t).Interface()
+		} else {
+			pt := reflect.NewValue(item.value).Type().(*reflect.PtrType)
+			pv := reflect.MakeZero(pt).(*reflect.PtrValue)
+			pv.PointTo(reflect.MakeZero(pt.Elem()))
+			value = pv.Interface()
+		}
+		err := goyaml.Unmarshal([]byte(item.data), value)
+		c.Assert(err, IsNil)
+		c.Assert(value, Equals, item.value)
+	}
 }
 
 var unmarshalErrorTests = []struct {
-    data, error string
+	data, error string
 }{
-    {"v: !!float 'error'",
-        "YAML error: Can't decode !!str 'error' as a !!float"},
-    {"v: [A,", "YAML error: line 1: did not find expected node content"},
-    {"v:\n- [A,", "YAML error: line 2: did not find expected node content"},
-    {"a: *b\n", "YAML error: Unknown anchor 'b' referenced"},
-    {"a: &a\n  b: *a\n", "YAML error: Anchor 'a' value contains itself"},
+	{"v: !!float 'error'",
+		"YAML error: Can't decode !!str 'error' as a !!float"},
+	{"v: [A,", "YAML error: line 1: did not find expected node content"},
+	{"v:\n- [A,", "YAML error: line 2: did not find expected node content"},
+	{"a: *b\n", "YAML error: Unknown anchor 'b' referenced"},
+	{"a: &a\n  b: *a\n", "YAML error: Anchor 'a' value contains itself"},
 }
 
 func (s *S) TestUnmarshalErrors(c *C) {
-    for _, item := range unmarshalErrorTests {
-        var value interface{}
-        err := goyaml.Unmarshal([]byte(item.data), &value)
-        c.Assert(err, Matches, item.error, Bug("Partial unmarshal: %#v", value))
-    }
+	for _, item := range unmarshalErrorTests {
+		var value interface{}
+		err := goyaml.Unmarshal([]byte(item.data), &value)
+		c.Assert(err, Matches, item.error, Bug("Partial unmarshal: %#v", value))
+	}
 }
 
 var setterTests = []struct {
-    data, tag string
-    value     interface{}
+	data, tag string
+	value     interface{}
 }{
-    {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}},
-    {"_: [1,A]", "!!seq", []interface{}{1, "A"}},
-    {"_: 10", "!!int", 10},
-    {"_: null", "!!null", nil},
-    {"_: !!foo 'BAR!'", "!!foo", "BAR!"},
+	{"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}},
+	{"_: [1,A]", "!!seq", []interface{}{1, "A"}},
+	{"_: 10", "!!int", 10},
+	{"_: null", "!!null", nil},
+	{"_: !!foo 'BAR!'", "!!foo", "BAR!"},
 }
 
 var setterResult = map[int]bool{}
 
 type typeWithSetter struct {
-    tag   string
-    value interface{}
+	tag   string
+	value interface{}
 }
 
 func (o *typeWithSetter) SetYAML(tag string, value interface{}) (ok bool) {
-    o.tag = tag
-    o.value = value
-    if i, ok := value.(int); ok {
-        if result, ok := setterResult[i]; ok {
-            return result
-        }
-    }
-    return true
+	o.tag = tag
+	o.value = value
+	if i, ok := value.(int); ok {
+		if result, ok := setterResult[i]; ok {
+			return result
+		}
+	}
+	return true
 }
 
 type typeWithSetterField struct {
-    Field *typeWithSetter "_"
+	Field *typeWithSetter "_"
 }
 
 func (s *S) TestUnmarshalWithSetter(c *C) {
-    for _, item := range setterTests {
-        obj := &typeWithSetterField{}
-        err := goyaml.Unmarshal([]byte(item.data), obj)
-        c.Assert(err, IsNil)
-        c.Assert(obj.Field, NotNil,
-            Bug("Pointer not initialized (%#v)", item.value))
-        c.Assert(obj.Field.tag, Equals, item.tag)
-        c.Assert(obj.Field.value, Equals, item.value)
-    }
+	for _, item := range setterTests {
+		obj := &typeWithSetterField{}
+		err := goyaml.Unmarshal([]byte(item.data), obj)
+		c.Assert(err, IsNil)
+		c.Assert(obj.Field, NotNil,
+			Bug("Pointer not initialized (%#v)", item.value))
+		c.Assert(obj.Field.tag, Equals, item.tag)
+		c.Assert(obj.Field.value, Equals, item.value)
+	}
 }
 
 func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) {
-    obj := &typeWithSetter{}
-    err := goyaml.Unmarshal([]byte(setterTests[0].data), obj)
-    c.Assert(err, IsNil)
-    c.Assert(obj.tag, Equals, setterTests[0].tag)
-    value, ok := obj.value.(map[interface{}]interface{})
-    c.Assert(ok, Equals, true)
-    c.Assert(value["_"], Equals, setterTests[0].value)
+	obj := &typeWithSetter{}
+	err := goyaml.Unmarshal([]byte(setterTests[0].data), obj)
+	c.Assert(err, IsNil)
+	c.Assert(obj.tag, Equals, setterTests[0].tag)
+	value, ok := obj.value.(map[interface{}]interface{})
+	c.Assert(ok, Equals, true)
+	c.Assert(value["_"], Equals, setterTests[0].value)
 }
 
 func (s *S) TestUnmarshalWithFalseSetterIgnoresValue(c *C) {
-    setterResult[2] = false
-    setterResult[4] = false
-    defer func() {
-        setterResult[2] = false, false
-        setterResult[4] = false, false
-    }()
+	setterResult[2] = false
+	setterResult[4] = false
+	defer func() {
+		setterResult[2] = false, false
+		setterResult[4] = false, false
+	}()
 
-    m := map[string]*typeWithSetter{}
-    data := "{abc: 1, def: 2, ghi: 3, jkl: 4}"
-    err := goyaml.Unmarshal([]byte(data), m)
-    c.Assert(err, IsNil)
-    c.Assert(m["abc"], NotNil)
-    c.Assert(m["def"], IsNil)
-    c.Assert(m["ghi"], NotNil)
-    c.Assert(m["jkl"], IsNil)
+	m := map[string]*typeWithSetter{}
+	data := "{abc: 1, def: 2, ghi: 3, jkl: 4}"
+	err := goyaml.Unmarshal([]byte(data), m)
+	c.Assert(err, IsNil)
+	c.Assert(m["abc"], NotNil)
+	c.Assert(m["def"], IsNil)
+	c.Assert(m["ghi"], NotNil)
+	c.Assert(m["jkl"], IsNil)
 
-    c.Assert(m["abc"].value, Equals, 1)
-    c.Assert(m["ghi"].value, Equals, 3)
+	c.Assert(m["abc"].value, Equals, 1)
+	c.Assert(m["ghi"].value, Equals, 3)
 }
diff --git a/encode.go b/encode.go
index 8233eb7..2eba6a5 100644
--- a/encode.go
+++ b/encode.go
@@ -4,284 +4,284 @@
 import "C"
 
 import (
-    "reflect"
-    "unsafe"
-    "strconv"
+	"reflect"
+	"unsafe"
+	"strconv"
 )
 
 
 type encoder struct {
-    emitter C.yaml_emitter_t
-    event   C.yaml_event_t
-    out     []byte
-    tmp     []byte
-    tmph    *reflect.SliceHeader
-    flow    bool
+	emitter C.yaml_emitter_t
+	event   C.yaml_event_t
+	out     []byte
+	tmp     []byte
+	tmph    *reflect.SliceHeader
+	flow    bool
 }
 
 
 //export outputHandler
 func outputHandler(data unsafe.Pointer, buffer *C.uchar, size C.size_t) C.int {
-    e := (*encoder)(data)
-    e.tmph.Data = uintptr(unsafe.Pointer(buffer))
-    e.tmph.Len = int(size)
-    e.tmph.Cap = int(size)
-    e.out = append(e.out, e.tmp...)
-    return 1
+	e := (*encoder)(data)
+	e.tmph.Data = uintptr(unsafe.Pointer(buffer))
+	e.tmph.Len = int(size)
+	e.tmph.Cap = int(size)
+	e.out = append(e.out, e.tmp...)
+	return 1
 }
 
 func newEncoder() (e *encoder) {
-    e = &encoder{}
-    e.tmph = (*reflect.SliceHeader)(unsafe.Pointer(&e.tmp))
-    if C.yaml_emitter_initialize(&e.emitter) == 0 {
-        panic("Failed to initialize YAML emitter")
-    }
-    C.set_output_handler(&e.emitter)
-    C.yaml_stream_start_event_initialize(&e.event, C.YAML_UTF8_ENCODING)
-    e.emit()
-    C.yaml_document_start_event_initialize(&e.event, nil, nil, nil, 1)
-    e.emit()
-    return e
+	e = &encoder{}
+	e.tmph = (*reflect.SliceHeader)(unsafe.Pointer(&e.tmp))
+	if C.yaml_emitter_initialize(&e.emitter) == 0 {
+		panic("Failed to initialize YAML emitter")
+	}
+	C.set_output_handler(&e.emitter)
+	C.yaml_stream_start_event_initialize(&e.event, C.YAML_UTF8_ENCODING)
+	e.emit()
+	C.yaml_document_start_event_initialize(&e.event, nil, nil, nil, 1)
+	e.emit()
+	return e
 }
 
 func (e *encoder) finish() {
-    C.yaml_document_end_event_initialize(&e.event, 1)
-    e.emit()
-    e.emitter.open_ended = 0
-    C.yaml_stream_end_event_initialize(&e.event)
-    e.emit()
+	C.yaml_document_end_event_initialize(&e.event, 1)
+	e.emit()
+	e.emitter.open_ended = 0
+	C.yaml_stream_end_event_initialize(&e.event)
+	e.emit()
 }
 
 func (e *encoder) destroy() {
-    C.yaml_emitter_delete(&e.emitter)
+	C.yaml_emitter_delete(&e.emitter)
 }
 
 func (e *encoder) emit() {
-    // This will internally delete the e.event value.
-    if C.yaml_emitter_emit(&e.emitter, &e.event) == 0 &&
-        e.event._type != C.YAML_DOCUMENT_END_EVENT &&
-        e.event._type != C.YAML_STREAM_END_EVENT {
-        if e.emitter.error == C.YAML_EMITTER_ERROR {
-            // XXX TESTME
-            panic("YAML emitter error: " + C.GoString(e.emitter.problem))
-        } else {
-            // XXX TESTME
-            panic("Unknown YAML emitter error")
-        }
-    }
+	// This will internally delete the e.event value.
+	if C.yaml_emitter_emit(&e.emitter, &e.event) == 0 &&
+		e.event._type != C.YAML_DOCUMENT_END_EVENT &&
+		e.event._type != C.YAML_STREAM_END_EVENT {
+		if e.emitter.error == C.YAML_EMITTER_ERROR {
+			// XXX TESTME
+			panic("YAML emitter error: " + C.GoString(e.emitter.problem))
+		} else {
+			// XXX TESTME
+			panic("Unknown YAML emitter error")
+		}
+	}
 }
 
 func (e *encoder) fail(msg string) {
-    if msg == "" {
-        if e.emitter.problem != nil {
-            msg = C.GoString(e.emitter.problem)
-        } else {
-            msg = "Unknown problem generating YAML content"
-        }
-    }
-    panic(msg)
+	if msg == "" {
+		if e.emitter.problem != nil {
+			msg = C.GoString(e.emitter.problem)
+		} else {
+			msg = "Unknown problem generating YAML content"
+		}
+	}
+	panic(msg)
 }
 
 func (e *encoder) marshal(tag string, in reflect.Value) {
-    var value interface{}
-    if getter, ok := in.Interface().(Getter); ok {
-        tag, value = getter.GetYAML()
-        if value == nil {
-            e.nilv()
-            return
-        }
-        in = reflect.NewValue(value)
-    }
-    switch in := in.(type) {
-    case *reflect.InterfaceValue:
-        if in.IsNil() {
-            e.nilv()
-        } else {
-            e.marshal(tag, in.Elem())
-        }
-    case *reflect.MapValue:
-        e.mapv(tag, in)
-    case *reflect.PtrValue:
-        if in.IsNil() {
-            e.nilv()
-        } else {
-            e.marshal(tag, in.Elem())
-        }
-    case *reflect.StructValue:
-        e.structv(tag, in)
-    case *reflect.SliceValue:
-        e.slicev(tag, in)
-    case *reflect.StringValue:
-        e.stringv(tag, in)
-    case *reflect.IntValue:
-        e.intv(tag, in)
-    case *reflect.UintValue:
-        e.uintv(tag, in)
-    case *reflect.FloatValue:
-        e.floatv(tag, in)
-    case *reflect.BoolValue:
-        e.boolv(tag, in)
-    default:
-        panic("Can't marshal type yet: " + in.Type().String())
-    }
+	var value interface{}
+	if getter, ok := in.Interface().(Getter); ok {
+		tag, value = getter.GetYAML()
+		if value == nil {
+			e.nilv()
+			return
+		}
+		in = reflect.NewValue(value)
+	}
+	switch in := in.(type) {
+	case *reflect.InterfaceValue:
+		if in.IsNil() {
+			e.nilv()
+		} else {
+			e.marshal(tag, in.Elem())
+		}
+	case *reflect.MapValue:
+		e.mapv(tag, in)
+	case *reflect.PtrValue:
+		if in.IsNil() {
+			e.nilv()
+		} else {
+			e.marshal(tag, in.Elem())
+		}
+	case *reflect.StructValue:
+		e.structv(tag, in)
+	case *reflect.SliceValue:
+		e.slicev(tag, in)
+	case *reflect.StringValue:
+		e.stringv(tag, in)
+	case *reflect.IntValue:
+		e.intv(tag, in)
+	case *reflect.UintValue:
+		e.uintv(tag, in)
+	case *reflect.FloatValue:
+		e.floatv(tag, in)
+	case *reflect.BoolValue:
+		e.boolv(tag, in)
+	default:
+		panic("Can't marshal type yet: " + in.Type().String())
+	}
 }
 
 func (e *encoder) mapv(tag string, in *reflect.MapValue) {
-    e.mappingv(tag, func() {
-        for _, k := range in.Keys() {
-            e.marshal("", k)
-            e.marshal("", in.Elem(k))
-        }
-    })
+	e.mappingv(tag, func() {
+		for _, k := range in.Keys() {
+			e.marshal("", k)
+			e.marshal("", in.Elem(k))
+		}
+	})
 }
 
 func (e *encoder) structv(tag string, in *reflect.StructValue) {
-    fields, err := getStructFields(in.Type().(*reflect.StructType))
-    if err != nil {
-        panic(err)
-    }
-    e.mappingv(tag, func() {
-        for i, info := range fields.List {
-            value := in.Field(i)
-            if info.Conditional && isZero(value) {
-                continue
-            }
-            e.marshal("", reflect.NewValue(info.Key))
-            e.flow = info.Flow
-            e.marshal("", value)
-        }
-    })
+	fields, err := getStructFields(in.Type().(*reflect.StructType))
+	if err != nil {
+		panic(err)
+	}
+	e.mappingv(tag, func() {
+		for i, info := range fields.List {
+			value := in.Field(i)
+			if info.Conditional && isZero(value) {
+				continue
+			}
+			e.marshal("", reflect.NewValue(info.Key))
+			e.flow = info.Flow
+			e.marshal("", value)
+		}
+	})
 }
 
 func (e *encoder) mappingv(tag string, f func()) {
-    var ctag *C.yaml_char_t
-    var free func()
-    cimplicit := C.int(1)
-    if tag != "" {
-        ctag, free = ystr(tag)
-        defer free()
-        cimplicit = 0
-    }
-    cstyle := C.yaml_mapping_style_t(C.YAML_BLOCK_MAPPING_STYLE)
-    if e.flow {
-        e.flow = false
-        cstyle = C.YAML_FLOW_MAPPING_STYLE
-    }
-    C.yaml_mapping_start_event_initialize(&e.event, nil, ctag, cimplicit,
-        cstyle)
-    e.emit()
-    f()
-    C.yaml_mapping_end_event_initialize(&e.event)
-    e.emit()
+	var ctag *C.yaml_char_t
+	var free func()
+	cimplicit := C.int(1)
+	if tag != "" {
+		ctag, free = ystr(tag)
+		defer free()
+		cimplicit = 0
+	}
+	cstyle := C.yaml_mapping_style_t(C.YAML_BLOCK_MAPPING_STYLE)
+	if e.flow {
+		e.flow = false
+		cstyle = C.YAML_FLOW_MAPPING_STYLE
+	}
+	C.yaml_mapping_start_event_initialize(&e.event, nil, ctag, cimplicit,
+		cstyle)
+	e.emit()
+	f()
+	C.yaml_mapping_end_event_initialize(&e.event)
+	e.emit()
 }
 
 func (e *encoder) slicev(tag string, in *reflect.SliceValue) {
-    var ctag *C.yaml_char_t
-    var free func()
-    var cimplicit C.int
-    if tag != "" {
-        ctag, free = ystr(tag)
-        defer free()
-        cimplicit = 0
-    } else {
-        cimplicit = 1
-    }
+	var ctag *C.yaml_char_t
+	var free func()
+	var cimplicit C.int
+	if tag != "" {
+		ctag, free = ystr(tag)
+		defer free()
+		cimplicit = 0
+	} else {
+		cimplicit = 1
+	}
 
-    cstyle := C.yaml_sequence_style_t(C.YAML_BLOCK_SEQUENCE_STYLE)
-    if e.flow {
-        e.flow = false
-        cstyle = C.YAML_FLOW_SEQUENCE_STYLE
-    }
-    C.yaml_sequence_start_event_initialize(&e.event, nil, ctag, cimplicit,
-        cstyle)
-    e.emit()
-    n := in.Len()
-    for i := 0; i < n; i++ {
-        e.marshal("", in.Elem(i))
-    }
-    C.yaml_sequence_end_event_initialize(&e.event)
-    e.emit()
+	cstyle := C.yaml_sequence_style_t(C.YAML_BLOCK_SEQUENCE_STYLE)
+	if e.flow {
+		e.flow = false
+		cstyle = C.YAML_FLOW_SEQUENCE_STYLE
+	}
+	C.yaml_sequence_start_event_initialize(&e.event, nil, ctag, cimplicit,
+		cstyle)
+	e.emit()
+	n := in.Len()
+	for i := 0; i < n; i++ {
+		e.marshal("", in.Elem(i))
+	}
+	C.yaml_sequence_end_event_initialize(&e.event)
+	e.emit()
 }
 
 func (e *encoder) stringv(tag string, in *reflect.StringValue) {
-    var style C.yaml_scalar_style_t
-    s := in.Get()
-    if rtag, _ := resolve("", s); rtag != "!!str" {
-        style = C.YAML_DOUBLE_QUOTED_SCALAR_STYLE
-    } else {
-        style = C.YAML_PLAIN_SCALAR_STYLE
-    }
-    e.emitScalar(s, "", tag, style)
+	var style C.yaml_scalar_style_t
+	s := in.Get()
+	if rtag, _ := resolve("", s); rtag != "!!str" {
+		style = C.YAML_DOUBLE_QUOTED_SCALAR_STYLE
+	} else {
+		style = C.YAML_PLAIN_SCALAR_STYLE
+	}
+	e.emitScalar(s, "", tag, style)
 }
 
 func (e *encoder) boolv(tag string, in *reflect.BoolValue) {
-    var s string
-    if in.Get() {
-        s = "true"
-    } else {
-        s = "false"
-    }
-    e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
+	var s string
+	if in.Get() {
+		s = "true"
+	} else {
+		s = "false"
+	}
+	e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
 }
 
 func (e *encoder) intv(tag string, in *reflect.IntValue) {
-    s := strconv.Itoa64(in.Get())
-    e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
+	s := strconv.Itoa64(in.Get())
+	e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
 }
 
 func (e *encoder) uintv(tag string, in *reflect.UintValue) {
-    s := strconv.Uitoa64(in.Get())
-    e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
+	s := strconv.Uitoa64(in.Get())
+	e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
 }
 
 func (e *encoder) floatv(tag string, in *reflect.FloatValue) {
-    // FIXME: Handle 64 bits here.
-    s := strconv.Ftoa32(float32(in.Get()), 'g', -1)
-    switch s {
-    case "+Inf":
-        s = ".inf"
-    case "-Inf":
-        s = "-.inf"
-    case "NaN":
-        s = ".nan"
-    }
-    e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
+	// FIXME: Handle 64 bits here.
+	s := strconv.Ftoa32(float32(in.Get()), 'g', -1)
+	switch s {
+	case "+Inf":
+		s = ".inf"
+	case "-Inf":
+		s = "-.inf"
+	case "NaN":
+		s = ".nan"
+	}
+	e.emitScalar(s, "", tag, C.YAML_PLAIN_SCALAR_STYLE)
 }
 
 func (e *encoder) nilv() {
-    e.emitScalar("null", "", "", C.YAML_PLAIN_SCALAR_STYLE)
+	e.emitScalar("null", "", "", C.YAML_PLAIN_SCALAR_STYLE)
 }
 
 func (e *encoder) emitScalar(value, anchor, tag string,
 style C.yaml_scalar_style_t) {
-    var canchor, ctag, cvalue *C.yaml_char_t
-    var cimplicit C.int
-    var free func()
-    if anchor != "" {
-        canchor, free = ystr(anchor)
-        defer free()
-    }
-    if tag != "" {
-        ctag, free = ystr(tag)
-        defer free()
-        cimplicit = 0
-        style = C.YAML_PLAIN_SCALAR_STYLE
-    } else {
-        cimplicit = 1
-    }
-    cvalue, free = ystr(value)
-    defer free()
-    size := C.int(len(value))
-    if C.yaml_scalar_event_initialize(&e.event, canchor, ctag, cvalue, size,
-        cimplicit, cimplicit, style) == 0 {
-        e.fail("")
-    }
-    e.emit()
+	var canchor, ctag, cvalue *C.yaml_char_t
+	var cimplicit C.int
+	var free func()
+	if anchor != "" {
+		canchor, free = ystr(anchor)
+		defer free()
+	}
+	if tag != "" {
+		ctag, free = ystr(tag)
+		defer free()
+		cimplicit = 0
+		style = C.YAML_PLAIN_SCALAR_STYLE
+	} else {
+		cimplicit = 1
+	}
+	cvalue, free = ystr(value)
+	defer free()
+	size := C.int(len(value))
+	if C.yaml_scalar_event_initialize(&e.event, canchor, ctag, cvalue, size,
+		cimplicit, cimplicit, style) == 0 {
+		e.fail("")
+	}
+	e.emit()
 }
 
 func ystr(s string) (ys *C.yaml_char_t, free func()) {
-    up := unsafe.Pointer(C.CString(s))
-    ys = (*C.yaml_char_t)(up)
-    free = func() { C.free(up) }
-    return ys, free
+	up := unsafe.Pointer(C.CString(s))
+	ys = (*C.yaml_char_t)(up)
+	free = func() { C.free(up) }
+	return ys, free
 }
diff --git a/encode_test.go b/encode_test.go
index 2a8ceb1..5753cfc 100644
--- a/encode_test.go
+++ b/encode_test.go
@@ -2,105 +2,105 @@
 
 
 import (
-    .   "gocheck"
-    "goyaml"
-    "math"
-    //"reflect"
+	. "launchpad.net/gocheck"
+	"goyaml"
+	"math"
+	//"reflect"
 )
 
 var marshalIntTest = 123
 
 var marshalTests = []struct {
-    data  string
-    value interface{}
+	data  string
+	value interface{}
 }{
-    {"{}\n", &struct{}{}},
-    {"v: hi\n", map[string]string{"v": "hi"}},
-    {"v: hi\n", map[string]interface{}{"v": "hi"}},
-    {"v: \"true\"\n", map[string]string{"v": "true"}},
-    {"v: \"false\"\n", map[string]string{"v": "false"}},
-    {"v: true\n", map[string]interface{}{"v": true}},
-    {"v: false\n", map[string]interface{}{"v": false}},
-    {"v: 10\n", map[string]interface{}{"v": 10}},
-    {"v: -10\n", map[string]interface{}{"v": -10}},
-    {"v: 42\n", map[string]uint{"v": 42}},
-    {"v: 4294967296\n", map[string]interface{}{"v": int64(4294967296)}},
-    {"v: 4294967296\n", map[string]int64{"v": int64(4294967296)}},
-    {"v: 4294967296\n", map[string]uint64{"v": 4294967296}},
-    {"v: \"10\"\n", map[string]interface{}{"v": "10"}},
-    {"v: 0.1\n", map[string]interface{}{"v": 0.1}},
-    {"v: 0.1\n", map[string]interface{}{"v": float64(0.1)}},
-    {"v: -0.1\n", map[string]interface{}{"v": -0.1}},
-    {"v: .inf\n", map[string]interface{}{"v": math.Inf(+1)}},
-    {"v: -.inf\n", map[string]interface{}{"v": math.Inf(-1)}},
-    {"v: .nan\n", map[string]interface{}{"v": math.NaN()}},
-    {"v: null\n", map[string]interface{}{"v": nil}},
-    {"v: \"\"\n", map[string]interface{}{"v": ""}},
-    {"v:\n- A\n- B\n", map[string][]string{"v": []string{"A", "B"}}},
-    {"v:\n- A\n- 1\n", map[string][]interface{}{"v": []interface{}{"A", 1}}},
-    {"a:\n  b: c\n",
-        map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}},
+	{"{}\n", &struct{}{}},
+	{"v: hi\n", map[string]string{"v": "hi"}},
+	{"v: hi\n", map[string]interface{}{"v": "hi"}},
+	{"v: \"true\"\n", map[string]string{"v": "true"}},
+	{"v: \"false\"\n", map[string]string{"v": "false"}},
+	{"v: true\n", map[string]interface{}{"v": true}},
+	{"v: false\n", map[string]interface{}{"v": false}},
+	{"v: 10\n", map[string]interface{}{"v": 10}},
+	{"v: -10\n", map[string]interface{}{"v": -10}},
+	{"v: 42\n", map[string]uint{"v": 42}},
+	{"v: 4294967296\n", map[string]interface{}{"v": int64(4294967296)}},
+	{"v: 4294967296\n", map[string]int64{"v": int64(4294967296)}},
+	{"v: 4294967296\n", map[string]uint64{"v": 4294967296}},
+	{"v: \"10\"\n", map[string]interface{}{"v": "10"}},
+	{"v: 0.1\n", map[string]interface{}{"v": 0.1}},
+	{"v: 0.1\n", map[string]interface{}{"v": float64(0.1)}},
+	{"v: -0.1\n", map[string]interface{}{"v": -0.1}},
+	{"v: .inf\n", map[string]interface{}{"v": math.Inf(+1)}},
+	{"v: -.inf\n", map[string]interface{}{"v": math.Inf(-1)}},
+	{"v: .nan\n", map[string]interface{}{"v": math.NaN()}},
+	{"v: null\n", map[string]interface{}{"v": nil}},
+	{"v: \"\"\n", map[string]interface{}{"v": ""}},
+	{"v:\n- A\n- B\n", map[string][]string{"v": []string{"A", "B"}}},
+	{"v:\n- A\n- 1\n", map[string][]interface{}{"v": []interface{}{"A", 1}}},
+	{"a:\n  b: c\n",
+		map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}},
 
-    // Simple values.
-    {"123\n", &marshalIntTest},
+	// Simple values.
+	{"123\n", &marshalIntTest},
 
-    // Structures
-    {"hello: world\n", &struct{ Hello string }{"world"}},
-    {"a:\n  b: c\n", &struct {
-        A struct {
-            B string
-        }
-    }{struct{ B string }{"c"}}},
-    {"a:\n  b: c\n", &struct {
-        A *struct {
-            B string
-        }
-    }{&struct{ B string }{"c"}}},
-    {"a: null\n", &struct {
-        A *struct {
-            B string
-        }
-    }{}},
-    {"a: 1\n", &struct{ A int }{1}},
-    {"a:\n- 1\n- 2\n", &struct{ A []int }{[]int{1, 2}}},
-    {"a: 1\n", &struct {
-        B int "a"
-    }{1}},
-    {"a: true\n", &struct{ A bool }{true}},
+	// Structures
+	{"hello: world\n", &struct{ Hello string }{"world"}},
+	{"a:\n  b: c\n", &struct {
+		A struct {
+			B string
+		}
+	}{struct{ B string }{"c"}}},
+	{"a:\n  b: c\n", &struct {
+		A *struct {
+			B string
+		}
+	}{&struct{ B string }{"c"}}},
+	{"a: null\n", &struct {
+		A *struct {
+			B string
+		}
+	}{}},
+	{"a: 1\n", &struct{ A int }{1}},
+	{"a:\n- 1\n- 2\n", &struct{ A []int }{[]int{1, 2}}},
+	{"a: 1\n", &struct {
+		B int "a"
+	}{1}},
+	{"a: true\n", &struct{ A bool }{true}},
 
-    // Conditional flag
-    {"a: 1\n", &struct {
-        A   int "a/c"
-        B   int "b/c"
-    }{1, 0}},
-    {"{}\n", &struct {
-        A   int "a/c"
-        B   int "b/c"
-    }{0, 0}},
+	// Conditional flag
+	{"a: 1\n", &struct {
+		A int "a/c"
+		B int "b/c"
+	}{1, 0}},
+	{"{}\n", &struct {
+		A int "a/c"
+		B int "b/c"
+	}{0, 0}},
 
-    // Flow flag
-    {"a: [1, 2]\n", &struct {
-        A []int "a/f"
-    }{[]int{1, 2}}},
-    {"a: {b: c}\n",
-        &struct {
-            A map[string]string "a/f"
-        }{map[string]string{"b": "c"}}},
-    {"a: {b: c}\n",
-        &struct {
-            A struct {
-                B string
-            } "a/f"
-        }{struct{ B string }{"c"}}},
+	// Flow flag
+	{"a: [1, 2]\n", &struct {
+		A []int "a/f"
+	}{[]int{1, 2}}},
+	{"a: {b: c}\n",
+		&struct {
+			A map[string]string "a/f"
+		}{map[string]string{"b": "c"}}},
+	{"a: {b: c}\n",
+		&struct {
+			A struct {
+				B string
+			} "a/f"
+		}{struct{ B string }{"c"}}},
 }
 
 
 func (s *S) TestMarshal(c *C) {
-    for _, item := range marshalTests {
-        data, err := goyaml.Marshal(item.value)
-        c.Assert(err, IsNil)
-        c.Assert(string(data), Equals, item.data)
-    }
+	for _, item := range marshalTests {
+		data, err := goyaml.Marshal(item.value)
+		c.Assert(err, IsNil)
+		c.Assert(string(data), Equals, item.data)
+	}
 }
 
 //var unmarshalErrorTests = []struct{data, error string}{
@@ -118,54 +118,54 @@
 var marshalTaggedIfaceTest interface{} = &struct{ A string }{"B"}
 
 var getterTests = []struct {
-    data, tag string
-    value     interface{}
+	data, tag string
+	value     interface{}
 }{
-    {"_:\n  hi: there\n", "", map[interface{}]interface{}{"hi": "there"}},
-    {"_:\n- 1\n- A\n", "", []interface{}{1, "A"}},
-    {"_: 10\n", "", 10},
-    {"_: null\n", "", nil},
-    {"_: !foo BAR!\n", "!foo", "BAR!"},
-    {"_: !foo 1\n", "!foo", "1"},
-    {"_: !foo '\"1\"'\n", "!foo", "\"1\""},
-    {"_: !foo 1.1\n", "!foo", 1.1},
-    {"_: !foo 1\n", "!foo", 1},
-    {"_: !foo 1\n", "!foo", uint(1)},
-    {"_: !foo true\n", "!foo", true},
-    {"_: !foo\n- A\n- B\n", "!foo", []string{"A", "B"}},
-    {"_: !foo\n  A: B\n", "!foo", map[string]string{"A": "B"}},
-    {"_: !foo\n  a: B\n", "!foo", &marshalTaggedIfaceTest},
+	{"_:\n  hi: there\n", "", map[interface{}]interface{}{"hi": "there"}},
+	{"_:\n- 1\n- A\n", "", []interface{}{1, "A"}},
+	{"_: 10\n", "", 10},
+	{"_: null\n", "", nil},
+	{"_: !foo BAR!\n", "!foo", "BAR!"},
+	{"_: !foo 1\n", "!foo", "1"},
+	{"_: !foo '\"1\"'\n", "!foo", "\"1\""},
+	{"_: !foo 1.1\n", "!foo", 1.1},
+	{"_: !foo 1\n", "!foo", 1},
+	{"_: !foo 1\n", "!foo", uint(1)},
+	{"_: !foo true\n", "!foo", true},
+	{"_: !foo\n- A\n- B\n", "!foo", []string{"A", "B"}},
+	{"_: !foo\n  A: B\n", "!foo", map[string]string{"A": "B"}},
+	{"_: !foo\n  a: B\n", "!foo", &marshalTaggedIfaceTest},
 }
 
 type typeWithGetter struct {
-    tag   string
-    value interface{}
+	tag   string
+	value interface{}
 }
 
 func (o typeWithGetter) GetYAML() (tag string, value interface{}) {
-    return o.tag, o.value
+	return o.tag, o.value
 }
 
 type typeWithGetterField struct {
-    Field typeWithGetter "_"
+	Field typeWithGetter "_"
 }
 
 func (s *S) TestMashalWithGetter(c *C) {
-    for _, item := range getterTests {
-        obj := &typeWithGetterField{}
-        obj.Field.tag = item.tag
-        obj.Field.value = item.value
-        data, err := goyaml.Marshal(obj)
-        c.Assert(err, IsNil)
-        c.Assert(string(data), Equals, string(item.data))
-    }
+	for _, item := range getterTests {
+		obj := &typeWithGetterField{}
+		obj.Field.tag = item.tag
+		obj.Field.value = item.value
+		data, err := goyaml.Marshal(obj)
+		c.Assert(err, IsNil)
+		c.Assert(string(data), Equals, string(item.data))
+	}
 }
 
 func (s *S) TestUnmarshalWholeDocumentWithGetter(c *C) {
-    obj := &typeWithGetter{}
-    obj.tag = ""
-    obj.value = map[string]string{"hello": "world!"}
-    data, err := goyaml.Marshal(obj)
-    c.Assert(err, IsNil)
-    c.Assert(string(data), Equals, "hello: world!\n")
+	obj := &typeWithGetter{}
+	obj.tag = ""
+	obj.value = map[string]string{"hello": "world!"}
+	data, err := goyaml.Marshal(obj)
+	c.Assert(err, IsNil)
+	c.Assert(string(data), Equals, "hello: world!\n")
 }
diff --git a/goyaml.go b/goyaml.go
index 60d578e..58a9a05 100644
--- a/goyaml.go
+++ b/goyaml.go
@@ -10,25 +10,25 @@
 package goyaml
 
 import (
-    "reflect"
-    "runtime"
-    "strings"
-    "sync"
-    "os"
+	"reflect"
+	"runtime"
+	"strings"
+	"sync"
+	"os"
 )
 
 func handleErr(err *os.Error) {
-    if r := recover(); r != nil {
-        if _, ok := r.(runtime.Error); ok {
-            panic(r)
-        } else if s, ok := r.(string); ok {
-            *err = os.ErrorString("YAML error: " + s)
-        } else if e, ok := r.(os.Error); ok {
-            *err = e
-        } else {
-            panic(r)
-        }
-    }
+	if r := recover(); r != nil {
+		if _, ok := r.(runtime.Error); ok {
+			panic(r)
+		} else if s, ok := r.(string); ok {
+			*err = os.ErrorString("YAML error: " + s)
+		} else if e, ok := r.(os.Error); ok {
+			*err = e
+		} else {
+			panic(r)
+		}
+	}
 }
 
 // Objects implementing the goyaml.Setter interface will receive the YAML
@@ -37,14 +37,14 @@
 // works, the method should return true.  If it returns false, the given
 // value will be omitted from maps and slices.
 type Setter interface {
-    SetYAML(tag string, value interface{}) bool
+	SetYAML(tag string, value interface{}) bool
 }
 
 // Objects implementing the goyaml.Getter interface will get the GetYAML()
 // method called when goyaml is requested to marshal the given value, and
 // the result of this method will be marshaled in place of the actual object.
 type Getter interface {
-    GetYAML() (tag string, value interface{})
+	GetYAML() (tag string, value interface{})
 }
 
 // Unmarshal decodes the first document found within the in byte slice
@@ -80,15 +80,15 @@
 //     goyaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
 // 
 func Unmarshal(in []byte, out interface{}) (err os.Error) {
-    defer handleErr(&err)
-    d := newDecoder()
-    p := newParser(in)
-    defer p.destroy()
-    node := p.parse()
-    if node != nil {
-        d.unmarshal(node, reflect.NewValue(out))
-    }
-    return nil
+	defer handleErr(&err)
+	d := newDecoder()
+	p := newParser(in)
+	defer p.destroy()
+	node := p.parse()
+	if node != nil {
+		d.unmarshal(node, reflect.NewValue(out))
+	}
+	return nil
 }
 
 // Marshal writes the object provided into a YAML document. The structure
@@ -114,13 +114,13 @@
 //     goyaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
 //
 func Marshal(in interface{}) (out []byte, err os.Error) {
-    defer handleErr(&err)
-    e := newEncoder()
-    defer e.destroy()
-    e.marshal("", reflect.NewValue(in))
-    e.finish()
-    out = e.out
-    return
+	defer handleErr(&err)
+	e := newEncoder()
+	defer e.destroy()
+	e.marshal("", reflect.NewValue(in))
+	e.finish()
+	out = e.out
+	return
 }
 
 
@@ -130,99 +130,99 @@
 // The code in this section was copied from gobson.
 
 type structFields struct {
-    Map  map[string]fieldInfo
-    List []fieldInfo
+	Map  map[string]fieldInfo
+	List []fieldInfo
 }
 
 type fieldInfo struct {
-    Key         string
-    Num         int
-    Conditional bool
-    Flow        bool
+	Key         string
+	Num         int
+	Conditional bool
+	Flow        bool
 }
 
 var fieldMap = make(map[string]*structFields)
 var fieldMapMutex sync.RWMutex
 
 func getStructFields(st *reflect.StructType) (*structFields, os.Error) {
-    path := st.PkgPath()
-    name := st.Name()
+	path := st.PkgPath()
+	name := st.Name()
 
-    fullName := path + "." + name
-    fieldMapMutex.RLock()
-    fields, found := fieldMap[fullName]
-    fieldMapMutex.RUnlock()
-    if found {
-        return fields, nil
-    }
+	fullName := path + "." + name
+	fieldMapMutex.RLock()
+	fields, found := fieldMap[fullName]
+	fieldMapMutex.RUnlock()
+	if found {
+		return fields, nil
+	}
 
-    n := st.NumField()
-    fieldsMap := make(map[string]fieldInfo)
-    fieldsList := make([]fieldInfo, n)
-    for i := 0; i != n; i++ {
-        field := st.Field(i)
-        if field.PkgPath != "" {
-            continue // Private field
-        }
+	n := st.NumField()
+	fieldsMap := make(map[string]fieldInfo)
+	fieldsList := make([]fieldInfo, n)
+	for i := 0; i != n; i++ {
+		field := st.Field(i)
+		if field.PkgPath != "" {
+			continue // Private field
+		}
 
-        info := fieldInfo{Num: i}
+		info := fieldInfo{Num: i}
 
-        if s := strings.LastIndex(field.Tag, "/"); s != -1 {
-            for _, c := range field.Tag[s+1:] {
-                switch c {
-                case int('c'):
-                    info.Conditional = true
-                case int('f'):
-                    info.Flow = true
-                default:
-                    panic("Unsupported field flag: " + string([]int{c}))
-                }
-            }
-            field.Tag = field.Tag[:s]
-        }
+		if s := strings.LastIndex(field.Tag, "/"); s != -1 {
+			for _, c := range field.Tag[s+1:] {
+				switch c {
+				case int('c'):
+					info.Conditional = true
+				case int('f'):
+					info.Flow = true
+				default:
+					panic("Unsupported field flag: " + string([]int{c}))
+				}
+			}
+			field.Tag = field.Tag[:s]
+		}
 
-        if field.Tag != "" {
-            info.Key = field.Tag
-        } else {
-            info.Key = strings.ToLower(field.Name)
-        }
+		if field.Tag != "" {
+			info.Key = field.Tag
+		} else {
+			info.Key = strings.ToLower(field.Name)
+		}
 
-        if _, found = fieldsMap[info.Key]; found {
-            msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
-            return nil, os.NewError(msg)
-        }
+		if _, found = fieldsMap[info.Key]; found {
+			msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
+			return nil, os.NewError(msg)
+		}
 
-        fieldsList[len(fieldsMap)] = info
-        fieldsMap[info.Key] = info
-    }
+		fieldsList[len(fieldsMap)] = info
+		fieldsMap[info.Key] = info
+	}
 
-    fields = &structFields{fieldsMap, fieldsList[:len(fieldsMap)]}
+	fields = &structFields{fieldsMap, fieldsList[:len(fieldsMap)]}
 
-    if fullName != "." {
-        fieldMapMutex.Lock()
-        fieldMap[fullName] = fields
-        fieldMapMutex.Unlock()
-    }
+	if fullName != "." {
+		fieldMapMutex.Lock()
+		fieldMap[fullName] = fields
+		fieldMapMutex.Unlock()
+	}
 
-    return fields, nil
+	return fields, nil
 }
 
 func isZero(v reflect.Value) bool {
-    switch v := v.(type) {
-    case *reflect.StringValue:
-        return len(v.Get()) == 0
-    case *reflect.InterfaceValue:
-        return v.IsNil()
-    case *reflect.SliceValue:
-        return v.Len() == 0
-    case *reflect.MapValue:
-        return v.Len() == 0
-    case *reflect.IntValue:
-        return v.Get() == 0
-    case *reflect.UintValue:
-        return v.Get() == 0
-    case *reflect.BoolValue:
-        return !v.Get()
-    }
-    return false
+	switch v := v.(type) {
+	case *reflect.StringValue:
+		return len(v.Get()) == 0
+	case *reflect.InterfaceValue:
+		return v.IsNil()
+	case *reflect.SliceValue:
+		return v.Len() == 0
+	case *reflect.MapValue:
+		return v.Len() == 0
+	case *reflect.IntValue:
+		return v.Get() == 0
+	case *reflect.UintValue:
+		return v.Get() == 0
+	case *reflect.BoolValue:
+		return !v.Get()
+	}
+	return false
 }
diff --git a/resolve.go b/resolve.go
index 45e6955..36f43ff 100644
--- a/resolve.go
+++ b/resolve.go
@@ -1,9 +1,9 @@
 package goyaml
 
 import (
-    "strconv"
-    "strings"
-    "math"
+	"strconv"
+	"strings"
+	"math"
 )
 
 
@@ -11,8 +11,8 @@
 
 
 type resolveMapItem struct {
-    value interface{}
-    tag   string
+	value interface{}
+	tag   string
 }
 
 var resolveTable = make([]byte, 256)
@@ -20,139 +20,139 @@
 
 
 func init() {
-    t := resolveTable
-    t[int('+')] = 'S' // Sign
-    t[int('-')] = 'S'
-    for _, c := range "0123456789" {
-        t[int(c)] = 'D' // Digit
-    }
-    for _, c := range "yYnNtTfFoO~" {
-        t[int(c)] = 'M' // In map
-    }
-    t[int('.')] = '.' // Float (potentially in map)
-    t[int('<')] = '<' // Merge
+	t := resolveTable
+	t[int('+')] = 'S' // Sign
+	t[int('-')] = 'S'
+	for _, c := range "0123456789" {
+		t[int(c)] = 'D' // Digit
+	}
+	for _, c := range "yYnNtTfFoO~" {
+		t[int(c)] = 'M' // In map
+	}
+	t[int('.')] = '.' // Float (potentially in map)
+	t[int('<')] = '<' // Merge
 
-    var resolveMapList = []struct {
-        v   interface{}
-        tag string
-        l   []string
-    }{
-        {true, "!!bool", []string{"y", "Y", "yes", "Yes", "YES"}},
-        {true, "!!bool", []string{"true", "True", "TRUE"}},
-        {true, "!!bool", []string{"on", "On", "ON"}},
-        {false, "!!bool", []string{"n", "N", "no", "No", "NO"}},
-        {false, "!!bool", []string{"false", "False", "FALSE"}},
-        {false, "!!bool", []string{"off", "Off", "OFF"}},
-        {nil, "!!null", []string{"~", "null", "Null", "NULL"}},
-        {math.NaN(), "!!float", []string{".nan", ".NaN", ".NAN"}},
-        {math.Inf(+1), "!!float", []string{".inf", ".Inf", ".INF"}},
-        {math.Inf(+1), "!!float", []string{"+.inf", "+.Inf", "+.INF"}},
-        {math.Inf(-1), "!!float", []string{"-.inf", "-.Inf", "-.INF"}},
-    }
+	var resolveMapList = []struct {
+		v   interface{}
+		tag string
+		l   []string
+	}{
+		{true, "!!bool", []string{"y", "Y", "yes", "Yes", "YES"}},
+		{true, "!!bool", []string{"true", "True", "TRUE"}},
+		{true, "!!bool", []string{"on", "On", "ON"}},
+		{false, "!!bool", []string{"n", "N", "no", "No", "NO"}},
+		{false, "!!bool", []string{"false", "False", "FALSE"}},
+		{false, "!!bool", []string{"off", "Off", "OFF"}},
+		{nil, "!!null", []string{"~", "null", "Null", "NULL"}},
+		{math.NaN(), "!!float", []string{".nan", ".NaN", ".NAN"}},
+		{math.Inf(+1), "!!float", []string{".inf", ".Inf", ".INF"}},
+		{math.Inf(+1), "!!float", []string{"+.inf", "+.Inf", "+.INF"}},
+		{math.Inf(-1), "!!float", []string{"-.inf", "-.Inf", "-.INF"}},
+	}
 
-    m := resolveMap
-    for _, item := range resolveMapList {
-        for _, s := range item.l {
-            m[s] = resolveMapItem{item.v, item.tag}
-        }
-    }
+	m := resolveMap
+	for _, item := range resolveMapList {
+		for _, s := range item.l {
+			m[s] = resolveMapItem{item.v, item.tag}
+		}
+	}
 }
 
 const longTagPrefix = "tag:yaml.org,2002:"
 
 func shortTag(tag string) string {
-    if strings.HasPrefix(tag, longTagPrefix) {
-        return "!!" + tag[len(longTagPrefix):]
-    }
-    return tag
+	if strings.HasPrefix(tag, longTagPrefix) {
+		return "!!" + tag[len(longTagPrefix):]
+	}
+	return tag
 }
 
 func resolvableTag(tag string) bool {
-    switch tag {
-    case "", "!!str", "!!bool", "!!int", "!!float", "!!null":
-        return true
-    }
-    return false
+	switch tag {
+	case "", "!!str", "!!bool", "!!int", "!!float", "!!null":
+		return true
+	}
+	return false
 }
 
 func resolve(tag string, in string) (rtag string, out interface{}) {
-    tag = shortTag(tag)
-    if !resolvableTag(tag) {
-        return tag, in
-    }
+	tag = shortTag(tag)
+	if !resolvableTag(tag) {
+		return tag, in
+	}
 
-    defer func() {
-        if tag != "" && tag != rtag {
-            panic("Can't decode " + rtag + " '" + in + "' as a " + tag)
-        }
-    }()
+	defer func() {
+		if tag != "" && tag != rtag {
+			panic("Can't decode " + rtag + " '" + in + "' as a " + tag)
+		}
+	}()
 
-    if in == "" {
-        return "!!null", nil
-    }
+	if in == "" {
+		return "!!null", nil
+	}
 
-    c := resolveTable[in[0]]
-    if c == 0 {
-        // It's a string for sure. Nothing to do.
-        return "!!str", in
-    }
+	c := resolveTable[in[0]]
+	if c == 0 {
+		// It's a string for sure. Nothing to do.
+		return "!!str", in
+	}
 
-    // Handle things we can lookup in a map.
-    if item, ok := resolveMap[in]; ok {
-        return item.tag, item.value
-    }
+	// Handle things we can lookup in a map.
+	if item, ok := resolveMap[in]; ok {
+		return item.tag, item.value
+	}
 
-    switch c {
-    case 'M':
-        // We've already checked the map above.
+	switch c {
+	case 'M':
+		// We've already checked the map above.
 
-    case '.':
-        // Not in the map, so maybe a normal float.
-        floatv, err := strconv.Atof64(in)
-        if err == nil {
-            return "!!float", floatv
-        }
-        // XXX Handle base 60 floats here (WTF!)
+	case '.':
+		// Not in the map, so maybe a normal float.
+		floatv, err := strconv.Atof64(in)
+		if err == nil {
+			return "!!float", floatv
+		}
+		// XXX Handle base 60 floats here (WTF!)
 
-    case 'D', 'S':
-        // Int, float, or timestamp.
-        for i := 0; i != len(in); i++ {
-            if in[i] == '_' {
-                in = strings.Replace(in, "_", "", -1)
-                break
-            }
-        }
-        intv, err := strconv.Btoi64(in, 0)
-        if err == nil {
-            if intv == int64(int(intv)) {
-                return "!!int", int(intv)
-            } else {
-                return "!!int", intv
-            }
-        }
-        floatv, err := strconv.Atof64(in)
-        if err == nil {
-            return "!!float", floatv
-        }
-        if strings.HasPrefix(in, "0b") {
-            intv, err := strconv.Btoi64(in[2:], 2)
-            if err == nil {
-                return "!!int", int(intv)
-            }
-        } else if strings.HasPrefix(in, "-0b") {
-            intv, err := strconv.Btoi64(in[3:], 2)
-            if err == nil {
-                return "!!int", -int(intv)
-            }
-        }
-        // XXX Handle timestamps here.
+	case 'D', 'S':
+		// Int, float, or timestamp.
+		for i := 0; i != len(in); i++ {
+			if in[i] == '_' {
+				in = strings.Replace(in, "_", "", -1)
+				break
+			}
+		}
+		intv, err := strconv.Btoi64(in, 0)
+		if err == nil {
+			if intv == int64(int(intv)) {
+				return "!!int", int(intv)
+			} else {
+				return "!!int", intv
+			}
+		}
+		floatv, err := strconv.Atof64(in)
+		if err == nil {
+			return "!!float", floatv
+		}
+		if strings.HasPrefix(in, "0b") {
+			intv, err := strconv.Btoi64(in[2:], 2)
+			if err == nil {
+				return "!!int", int(intv)
+			}
+		} else if strings.HasPrefix(in, "-0b") {
+			intv, err := strconv.Btoi64(in[3:], 2)
+			if err == nil {
+				return "!!int", -int(intv)
+			}
+		}
+		// XXX Handle timestamps here.
 
-    case '<':
-        // XXX Handle merge (<<) here.
+	case '<':
+		// XXX Handle merge (<<) here.
 
-    default:
-        panic("resolveTable item not yet handled: " +
-            string([]byte{c}) + " (with " + in + ")")
-    }
-    return "!!str", in
+	default:
+		panic("resolveTable item not yet handled: " +
+			string([]byte{c}) + " (with " + in + ")")
+	}
+	return "!!str", in
 }
diff --git a/suite_test.go b/suite_test.go
index be26fc2..03359cd 100644
--- a/suite_test.go
+++ b/suite_test.go
@@ -2,8 +2,8 @@
 
 
 import (
-    .   "gocheck"
-    "testing"
+	. "launchpad.net/gocheck"
+	"testing"
 )
 
 func Test(t *testing.T) { TestingT(t) }
