Issue #11: Add LoadString
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 160cd83..b82f095 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 ## Changelog
 
+### [1.6.1](https://github.com/magiconair/properties/tags/v1.6.1) - unreleased
+
+ * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString](http://godoc.org/github.com/magiconair/properties#Properties.LoadString) method to load properties from an UTF8 string.
+
 ### [1.6.0](https://github.com/magiconair/properties/tags/v1.6.0) - 11 Dec 2015
 
  * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags.
diff --git a/load.go b/load.go
index 431d462..c983d78 100644
--- a/load.go
+++ b/load.go
@@ -26,6 +26,11 @@
 	return loadBuf(buf, enc)
 }
 
+// LoadString reads an UTF8 string into a properties struct.
+func LoadString(s string) (*Properties, error) {
+	return loadBuf([]byte(s), UTF8)
+}
+
 // LoadFile reads a file into a Properties struct.
 func LoadFile(filename string, enc Encoding) (*Properties, error) {
 	return loadFiles([]string{filename}, enc, false)
@@ -38,27 +43,30 @@
 	return loadFiles(filenames, enc, ignoreMissing)
 }
 
+// MustLoadString reads an UTF8 string into a Properties struct and
+// panics on error.
+func MustLoadString(s string) *Properties {
+	return must(LoadString(s))
+}
+
 // MustLoadFile reads a file into a Properties struct and
 // panics on error.
 func MustLoadFile(filename string, enc Encoding) *Properties {
-	return mustLoadFiles([]string{filename}, enc, false)
+	return must(LoadFile(filename, enc))
 }
 
 // MustLoadFiles reads multiple files in the given order into
 // a Properties struct and panics on error. If 'ignoreMissing'
 // is true then non-existent files will not be reported as error.
 func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties {
-	return mustLoadFiles(filenames, enc, ignoreMissing)
+	return must(LoadFiles(filenames, enc, ignoreMissing))
 }
 
-// ----------------------------------------------------------------------------
-
 func loadBuf(buf []byte, enc Encoding) (*Properties, error) {
 	p, err := parse(convert(buf, enc))
 	if err != nil {
 		return nil, err
 	}
-
 	return p, p.check()
 }
 
@@ -88,8 +96,7 @@
 	return loadBuf(buff, enc)
 }
 
-func mustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties {
-	p, err := loadFiles(filenames, enc, ignoreMissing)
+func must(p *Properties, err error) *Properties {
 	if err != nil {
 		ErrorHandler(err)
 	}
diff --git a/load_test.go b/load_test.go
index e6dae8d..01fe321 100644
--- a/load_test.go
+++ b/load_test.go
@@ -17,11 +17,7 @@
 	tempFiles []string
 }
 
-var (
-	_ = Suite(&LoadSuite{})
-)
-
-// ----------------------------------------------------------------------------
+var _ = Suite(&LoadSuite{})
 
 func (s *LoadSuite) TestLoadFailsWithNotExistingFile(c *C) {
 	_, err := LoadFile("doesnotexist.properties", ISO_8859_1)
@@ -29,25 +25,26 @@
 	c.Assert(err, ErrorMatches, "open.*no such file or directory")
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) TestLoadFilesFailsOnNotExistingFile(c *C) {
 	_, err := LoadFiles([]string{"doesnotexist.properties"}, ISO_8859_1, false)
 	c.Assert(err, NotNil)
 	c.Assert(err, ErrorMatches, "open.*no such file or directory")
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) TestLoadFilesDoesNotFailOnNotExistingFileAndIgnoreMissing(c *C) {
 	p, err := LoadFiles([]string{"doesnotexist.properties"}, ISO_8859_1, true)
 	c.Assert(err, IsNil)
 	c.Assert(p.Len(), Equals, 0)
 }
 
-// ----------------------------------------------------------------------------
+func (s *LoadSuite) TestLoadString(c *C) {
+	x := "key=äüö"
+	p1 := MustLoadString(x)
+	p2 := must(Load([]byte(x), UTF8))
+	c.Assert(p1, DeepEquals, p2)
+}
 
-func (s *LoadSuite) TestLoad(c *C) {
+func (s *LoadSuite) TestLoadFile(c *C) {
 	filename := s.makeFile(c, "key=value")
 	p := MustLoadFile(filename, ISO_8859_1)
 
@@ -55,8 +52,6 @@
 	assertKeyValues(c, "", p, "key", "value")
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) TestLoadFiles(c *C) {
 	filename := s.makeFile(c, "key=value")
 	filename2 := s.makeFile(c, "key2=value2")
@@ -64,8 +59,6 @@
 	assertKeyValues(c, "", p, "key", "value", "key2", "value2")
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) TestLoadExpandedFile(c *C) {
 	filename := s.makeFilePrefix(c, os.Getenv("USER"), "key=value")
 	filename = strings.Replace(filename, os.Getenv("USER"), "${USER}", -1)
@@ -73,8 +66,6 @@
 	assertKeyValues(c, "", p, "key", "value")
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) TestLoadFilesAndIgnoreMissing(c *C) {
 	filename := s.makeFile(c, "key=value")
 	filename2 := s.makeFile(c, "key2=value2")
@@ -82,14 +73,10 @@
 	assertKeyValues(c, "", p, "key", "value", "key2", "value2")
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) SetUpSuite(c *C) {
 	s.tempFiles = make([]string, 0)
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) TearDownSuite(c *C) {
 	for _, path := range s.tempFiles {
 		err := os.Remove(path)
@@ -99,14 +86,10 @@
 	}
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) makeFile(c *C, data string) string {
 	return s.makeFilePrefix(c, "properties", data)
 }
 
-// ----------------------------------------------------------------------------
-
 func (s *LoadSuite) makeFilePrefix(c *C, prefix, data string) string {
 	f, err := ioutil.TempFile("", prefix)
 	if err != nil {