diff --git a/property-list.cabal b/property-list.cabal
--- a/property-list.cabal
+++ b/property-list.cabal
@@ -1,5 +1,5 @@
 name:                   property-list
-version:                0.0.0.3
+version:                0.0.0.4
 stability:              experimental
 license:                PublicDomain
 
@@ -12,7 +12,7 @@
 
 category:               Data, Parsing
 synopsis:               XML property list parser
-description:            Parser for Apple's XML property list 1.0 format.
+description:            Parser, data type and formatter for Apple's XML property list 1.0 format.
 
 Library
   hs-source-dirs:       src
@@ -22,10 +22,12 @@
                         Data.PropertyList.Type
                         Data.PropertyList.Parse
                         Data.PropertyList.PropertyListItem
+                        Data.PropertyList.Object
   build-depends:        base >= 3 && <5,
                         bytestring,
                         containers, 
                         dataenc,
+                        data-object,
                         HaXml >= 1.19,
                         mtl,
                         old-locale,
diff --git a/src/Data/PropertyList.hs b/src/Data/PropertyList.hs
--- a/src/Data/PropertyList.hs
+++ b/src/Data/PropertyList.hs
@@ -11,6 +11,7 @@
 import Data.PropertyList.Type
 import Data.PropertyList.Parse
 import Data.PropertyList.Xml
+import Data.PropertyList.Object ({- ToObject instances -})
 
 import Data.PropertyList.PropertyListItem
 
diff --git a/src/Data/PropertyList/Object.hs b/src/Data/PropertyList/Object.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/PropertyList/Object.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE 
+        FlexibleContexts, UndecidableInstances
+  #-}
+module Data.PropertyList.Object ({- instances only -}) where
+
+import Data.Object
+import Data.PropertyList.Type
+import Data.PropertyList.Parse
+import Data.PropertyList.Xml
+import Data.ByteString.Char8
+import qualified Data.Map as M
+import Control.Monad
+import Control.Monad
+import Control.Monad.Error
+
+instance ToScalar UnparsedPlistItem where
+    toScalar = pack . showXml . plistItemToPlist . unparsedPlistItemToPlistItem
+instance ToObject UnparsedPlistItem where
+    toObject = Scalar . toScalar
+
+instance (ToObject (l a), ToObject (m a)) => ToObject (PropertyListS l m a) where
+    toObject (PLArray a)    = toObject a
+    toObject (PLData bs)    = toObject bs
+    toObject (PLDate d)     = showToScalar d
+    toObject (PLDict d)     = toObject d
+    toObject (PLReal d)     = showToScalar d
+    toObject (PLInt i)      = showToScalar i
+    toObject (PLString s)   = stringToScalar s
+    toObject (PLBool b)     = showToScalar b
+
+instance (ToObject (f (M f a)), ToObject a) => ToObject (M f a) where
+    toObject (S x) = toObject x
+    toObject (V a) = toObject a
+
+instance (ToScalar k, ToObject v) => ToObject (M.Map k v) where
+    toObject = toObject . M.assocs
+
+stringToScalar = Scalar . pack
+showToScalar :: Show a => a -> Object
+showToScalar = stringToScalar . show
+
+test = toObject (undefined :: PropertyList)
diff --git a/src/Data/PropertyList/Xml.hs b/src/Data/PropertyList/Xml.hs
--- a/src/Data/PropertyList/Xml.hs
+++ b/src/Data/PropertyList/Xml.hs
@@ -20,6 +20,9 @@
 
 type PlistItem = OneOf9 Array Data Date Dict AReal AInteger AString X.True X.False
 
+readPlist :: String -> Either String Plist
+readPlist = readXml
+
 readPlistFromFile :: FilePath -> IO (Either String Plist)
 readPlistFromFile path = do
         contents <- readFile path
