Added MustGet methods for all types
diff --git a/properties.go b/properties.go
index 289e6a4..7382520 100644
--- a/properties.go
+++ b/properties.go
@@ -34,7 +34,8 @@
 	}
 }
 
-// Get returns the expanded value for the given key if exists. Otherwise, ok is false.
+// Get returns the expanded value for the given key if exists.
+// Otherwise, ok is false.
 func (p *Properties) Get(key string) (value string, ok bool) {
 	v, ok := p.m[key]
 	if !ok {
@@ -53,60 +54,153 @@
 	return expanded, true
 }
 
+// MustGet returns the expanded value for the given key if exists.
+// Otherwise, it panics.
+func (p *Properties) MustGet(key string) string {
+	if v, ok := p.Get(key); ok {
+		return v
+	}
+	panic(invalidKeyError(key))
+}
+
+// ----------------------------------------------------------------------------
+
 // GetBool checks if the expanded value is one of '1', 'yes',
 // 'true' or 'on' if the key exists. The comparison is case-insensitive.
 // If the key does not exist the default value is returned.
 func (p *Properties) GetBool(key string, def bool) bool {
+	v, err := p.getBool(key)
+	if err != nil {
+		return def
+	}
+	return v
+}
+
+// MustGetBool checks if the expanded value is one of '1', 'yes',
+// 'true' or 'on' if the key exists. The comparison is case-insensitive.
+// If the key does not exist the function panics.
+func (p *Properties) MustGetBool(key string) bool {
+	v, err := p.getBool(key)
+	if err != nil {
+		panic(err)
+	}
+	return v
+}
+
+func (p *Properties) getBool(key string) (value bool, err error) {
 	if v, ok := p.Get(key); ok {
 		v = strings.ToLower(v)
-		return v == "1" || v == "true" || v == "yes" || v == "on"
+		return v == "1" || v == "true" || v == "yes" || v == "on", nil
 	}
-	return def
+	return false, invalidKeyError(key)
 }
 
+// ----------------------------------------------------------------------------
+
 // GetFloat64 parses the expanded value as a float64 if the key exists.
 // If key does not exist or the value cannot be parsed the default
 // value is returned.
 func (p *Properties) GetFloat64(key string, def float64) float64 {
-	if v, ok := p.Get(key); ok {
-		n, err := strconv.ParseFloat(v, 64)
-		if err != nil {
-			return def
-		}
-		return n
+	v, err := p.getFloat64(key)
+	if err != nil {
+		return def
 	}
-	return def
+	return v
 }
 
-// GetInt64 parses the expanded value as an int if the key exists.
+// GetFloat64 parses the expanded value as a float64 if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetFloat64(key string) float64 {
+	v, err := p.getFloat64(key)
+	if err != nil {
+		panic(err)
+	}
+	return v
+}
+
+func (p *Properties) getFloat64(key string) (value float64, err error) {
+	if v, ok := p.Get(key); ok {
+		value, err = strconv.ParseFloat(v, 64)
+		if err != nil {
+			return 0, err
+		}
+		return value, nil
+	}
+	return 0, invalidKeyError(key)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetInt64 parses the expanded value as an int64 if the key exists.
 // If key does not exist or the value cannot be parsed the default
 // value is returned.
 func (p *Properties) GetInt64(key string, def int64) int64 {
-	if v, ok := p.Get(key); ok {
-		n, err := strconv.ParseInt(v, 10, 64)
-		if err != nil {
-			return def
-		}
-		return n
+	v, err := p.getInt64(key)
+	if err != nil {
+		return def
 	}
-	return def
+	return v
 }
 
+// MustGetInt64 parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetInt64(key string) int64 {
+	v, err := p.getInt64(key)
+	if err != nil {
+		panic(err)
+	}
+	return v
+}
+
+func (p *Properties) getInt64(key string) (value int64, err error) {
+	if v, ok := p.Get(key); ok {
+		value, err = strconv.ParseInt(v, 10, 64)
+		if err != nil {
+			return 0, err
+		}
+		return value, nil
+	}
+	return 0, invalidKeyError(key)
+}
+
+// ----------------------------------------------------------------------------
+
 // GetUint64 parses the expanded value as an uint64 if the key exists.
 // If key does not exist or the value cannot be parsed the default
 // value is returned.
 func (p *Properties) GetUint64(key string, def uint64) uint64 {
-	if v, ok := p.Get(key); ok {
-		n, err := strconv.ParseUint(v, 10, 64)
-		if err != nil {
-			return def
-		}
-		return n
+	v, err := p.getUint64(key)
+	if err != nil {
+		return def
 	}
-	return def
+	return v
 }
 
-// GetString returns the expanded value for the given key if exists or the default value otherwise.
+// MustGetUint64 parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetUint64(key string) uint64 {
+	v, err := p.getUint64(key)
+	if err != nil {
+		panic(err)
+	}
+	return v
+}
+
+func (p *Properties) getUint64(key string) (value uint64, err error) {
+	if v, ok := p.Get(key); ok {
+		value, err = strconv.ParseUint(v, 10, 64)
+		if err != nil {
+			return 0, err
+		}
+		return value, nil
+	}
+	return 0, invalidKeyError(key)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetString returns the expanded value for the given key if exists or
+// the default value otherwise.
 func (p *Properties) GetString(key, def string) string {
 	if v, ok := p.Get(key); ok {
 		return v
@@ -114,6 +208,17 @@
 	return def
 }
 
+// MustGetString returns the expanded value for the given key if exists or
+// panics otherwise.
+func (p *Properties) MustGetString(key string) string {
+	if v, ok := p.Get(key); ok {
+		return v
+	}
+	panic(invalidKeyError(key))
+}
+
+// ----------------------------------------------------------------------------
+
 // Len returns the number of keys.
 func (p *Properties) Len() int {
 	return len(p.m)
@@ -273,3 +378,7 @@
 		return string(r)
 	}
 }
+
+func invalidKeyError(key string) error {
+	return fmt.Errorf("invalid key: %s", key)
+}
diff --git a/properties_test.go b/properties_test.go
index 2b2c715..3d2a413 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -266,6 +266,14 @@
 	}
 }
 
+func (l *TestSuite) TestMustGet(c *C) {
+	input := "key = value\nkey2 = ghi"
+	p, err := parse(input)
+	c.Assert(err, IsNil)
+	c.Assert(p.MustGet("key"), Equals, "value")
+	c.Assert(func() { p.MustGet("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
 func (l *TestSuite) TestGetBool(c *C) {
 	for _, test := range boolTests {
 		p, err := parse(test.input)
@@ -275,6 +283,14 @@
 	}
 }
 
+func (l *TestSuite) TestMustGetBool(c *C) {
+	input := "key = true\nkey2 = ghi"
+	p, err := parse(input)
+	c.Assert(err, IsNil)
+	c.Assert(p.MustGetBool("key"), Equals, true)
+	c.Assert(func() { p.MustGetBool("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
 func (l *TestSuite) TestGetFloat64(c *C) {
 	for _, test := range floatTests {
 		p, err := parse(test.input)
@@ -284,6 +300,15 @@
 	}
 }
 
+func (l *TestSuite) TestMustGetFloat64(c *C) {
+	input := "key = 123\nkey2 = ghi"
+	p, err := parse(input)
+	c.Assert(err, IsNil)
+	c.Assert(p.MustGetFloat64("key"), Equals, float64(123))
+	c.Assert(func() { p.MustGetFloat64("key2") }, PanicMatches, "strconv.ParseFloat: parsing.*")
+	c.Assert(func() { p.MustGetFloat64("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
 func (l *TestSuite) TestGetInt64(c *C) {
 	for _, test := range intTests {
 		p, err := parse(test.input)
@@ -293,6 +318,15 @@
 	}
 }
 
+func (l *TestSuite) TestMustGetInt64(c *C) {
+	input := "key = 123\nkey2 = ghi"
+	p, err := parse(input)
+	c.Assert(err, IsNil)
+	c.Assert(p.MustGetInt64("key"), Equals, int64(123))
+	c.Assert(func() { p.MustGetInt64("key2") }, PanicMatches, "strconv.ParseInt: parsing.*")
+	c.Assert(func() { p.MustGetInt64("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
 func (l *TestSuite) TestGetUint64(c *C) {
 	for _, test := range uintTests {
 		p, err := parse(test.input)
@@ -302,6 +336,15 @@
 	}
 }
 
+func (l *TestSuite) TestMustGetUint64(c *C) {
+	input := "key = 123\nkey2 = ghi"
+	p, err := parse(input)
+	c.Assert(err, IsNil)
+	c.Assert(p.MustGetUint64("key"), Equals, uint64(123))
+	c.Assert(func() { p.MustGetUint64("key2") }, PanicMatches, "strconv.ParseUint: parsing.*")
+	c.Assert(func() { p.MustGetUint64("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
 func (l *TestSuite) TestGetString(c *C) {
 	for _, test := range stringTests {
 		p, err := parse(test.input)
@@ -311,6 +354,14 @@
 	}
 }
 
+func (l *TestSuite) TestMustGetString(c *C) {
+	input := `key = value`
+	p, err := parse(input)
+	c.Assert(err, IsNil)
+	c.Assert(p.MustGetString("key"), Equals, "value")
+	c.Assert(func() { p.MustGetString("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
 func (l *TestSuite) TestWrite(c *C) {
 	for _, test := range writeTests {
 		input, output, enc := test[0], test[1], test[2]