added parsing
diff --git a/src/gojsonpointer/pointer.go b/src/gojsonpointer/pointer.go
index 7348f6e..64ee83b 100644
--- a/src/gojsonpointer/pointer.go
+++ b/src/gojsonpointer/pointer.go
@@ -5,6 +5,63 @@
 package gojsonpointer
 
 import (
-
+	"errors"
+	"strings"
 )
 
+const (
+	EMPTY_POINTER     = ``
+	POINTER_SEPARATOR = `/`
+)
+
+const (
+	INVALID_START = `JSON pointer must be empty or start with a "/"`
+)
+
+func NewJsonPointer(jsonPointerString string) (JsonPointer, error) {
+
+	var p JsonPointer
+	err := p.parse(jsonPointerString)
+	return p, err
+}
+
+type JsonPointer struct {
+	stringRepresentation string
+	referenceTokens      []string
+}
+
+func (p *JsonPointer) parse(jsonPointerString string) error {
+
+	var err error
+	p.stringRepresentation = jsonPointerString
+
+	if p.stringRepresentation != EMPTY_POINTER {
+		if !strings.HasPrefix(p.stringRepresentation, POINTER_SEPARATOR) {
+			err = errors.New(INVALID_START)
+		} else {
+			referenceTokens := strings.Split(p.stringRepresentation, POINTER_SEPARATOR)
+			for _, referenceToken := range referenceTokens[1:] {
+				p.referenceTokens = append(p.referenceTokens, decodeReferenceToken(referenceToken))
+			}
+		}
+	}
+
+	return err
+}
+
+func (p *JsonPointer) String() string {
+	return p.stringRepresentation
+}
+
+const (
+	ENCODED_REFERENCE_TOKEN_0 = `~0`
+	ENCODED_REFERENCE_TOKEN_1 = `~1`
+	DECODED_REFERENCE_TOKEN_0 = `~`
+	DECODED_REFERENCE_TOKEN_1 = `/`
+)
+
+func decodeReferenceToken(token string) string {
+	step1 := strings.Replace(token, ENCODED_REFERENCE_TOKEN_1, DECODED_REFERENCE_TOKEN_1, -1)
+	step2 := strings.Replace(step1, ENCODED_REFERENCE_TOKEN_0, DECODED_REFERENCE_TOKEN_0, -1)
+	return step2
+}