module Physics.ODE.Overloading where

import Physics.ODE.Types
import Data.Typeable
import Foreign

class HasDestroy a where
    destroy :: a -> IO ()

class IsPlaceable a where
    getPosition :: a -> IO (ODEreal, ODEreal, ODEreal)
    setPosition :: a -> ODEreal -> ODEreal -> ODEreal -> IO ()
    getQuaternion :: a -> IO (ODEreal, ODEreal, ODEreal, ODEreal)
    setQuaternion :: a -> (ODEreal, ODEreal, ODEreal, ODEreal) -> IO ()
    getRotation :: a -> IO Matrix3
    setRotation :: a -> Matrix3 -> IO ()

class HasData a where
    setRawData :: a -> Ptr b -> IO ()
    setData :: a -> b -> IO ()
    setSafeData :: Typeable b => a -> b -> IO ()
    getRawData :: a -> IO (Ptr b)
    getData :: a -> IO b
    getSafeData :: Typeable b => a -> IO b
    tryGetSafeData :: Typeable b => a -> IO (Maybe b)

class HasEnable a where
    enable :: a -> IO ()
    disable :: a -> IO ()
    isEnabled :: a -> IO Bool