module Hails.MVC.Model.ProtectedModel.VersionedModel where

import Data.ExtraVersion

import Hails.MVC.Model.ProtectedModel
import Hails.MVC.Model.ReactiveModel
import Language.Haskell.TH.Syntax
import Language.Haskell.TH.DeriveField

class VersionedBasicModel a where
  getBMVersion :: a -> Version

class VersionedProtectedModel a where
  getVersion :: a -> IO Version

-- class VersionedReactiveModel a where
--   getRMVersion :: a -> String
-- 
-- instance VersionedBasicModel a => VersionedReactiveModel (ReactiveModel a) where
--   getRMVersion = getBMVersion . basicModel

instance (Event b, VersionedBasicModel a) => VersionedProtectedModel (ProtectedModel a b) where
  getVersion = (`onReactiveModel` getRMVersion)
    where getRMVersion = getBMVersion . basicModel

deriveVersioned :: Name -> Q [Dec]
deriveVersioned =
  deriveField "VersionedBasicModel" "getBMVersion" "version"