    {-# OPTIONS_GHC -fno-warn-duplicate-exports #-}

    -- | When propellor runs on a Host, it ensures that its Properties
    -- are satisfied, taking action as necessary when a Property is not
    -- currently satisfied.
    --
    -- A simple propellor program example:
    --
    -- > import Propellor
    -- > import qualified Propellor.Property.File as File
    -- > import qualified Propellor.Property.Apt as Apt
    -- >
    -- > main :: IO ()
    -- > main = defaultMain hosts
    -- >
    -- > hosts :: [Host]
    -- > hosts = [example]
    -- >
    -- > example :: Host
    -- > example = host "example.com" $ props
    -- >     & Apt.installed ["mydaemon"]
    -- >     & "/etc/mydaemon.conf" `File.containsLine` "secure=1"
    -- >       `onChange` cmdProperty "service" ["mydaemon", "restart"]
    -- >     ! Apt.installed ["unwantedpackage"]
    --
    -- See config.hs for a more complete example, and clone Propellor's
    -- git repository for a deployable system using Propellor:
    -- git clone <git://git.joeyh.name/propellor>

    module Propellor (
    	-- * Core data types
    	  Host(..)
    	, Property
    	, RevertableProperty
    	, module Propellor.Types
    	-- * Config file
    	, defaultMain
    	, host
    	, (&)
    	, (!)
    	-- * Propertries
    	-- | Properties are often combined together in your propellor
    	-- configuration. For example:
    	--
    	-- > "/etc/foo/config" `File.containsLine` "bar=1"
    	-- > 	`requires` File.dirExists "/etc/foo"
    	, requires
    	, before
    	, onChange
    	, describe
    	, module Propellor.Property
    	-- | Everything you need to build your own properties,
    	-- and useful property combinators
    	, module Propellor.Property.Cmd
    	-- | Properties to run shell commands
    	, module Propellor.Info
    	-- | Properties that set `Info`
    	, module Propellor.Property.List
    	-- | Combining a list of properties into a single property
    	, module Propellor.Types.PrivData
    	-- | Private data access for properties

    	, module X
    ) where

    import Propellor.Types
    import Propellor.CmdLine (defaultMain)
    import Propellor.Property
    import Propellor.Property.List
    import Propellor.Property.Cmd
    import Propellor.Types.PrivData
    import Propellor.Info
    import Propellor.PropAccum

    import Data.Monoid as X
    import Data.String as X (fromString)