    {-# 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)