{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
             FlexibleInstances, TypeSynonymInstances, 
             EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}

-- module HROOT.Class.Interface where

module HROOT.Class.TVirtualPad.Interface where


import Data.Word
import Foreign.ForeignPtr
import HROOT.TypeCast

import HROOT.Class.TVirtualPad.RawType
import HROOT.Class.TFrame.RawType
import HROOT.Class.TObject.Interface
import HROOT.Class.TAttLine.Interface
import HROOT.Class.TAttFill.Interface
import HROOT.Class.TAttPad.Interface
import HROOT.Class.TQObject.Interface


class (ITObject a,ITAttLine a,ITAttFill a,ITAttPad a,ITQObject a) => ITVirtualPad a where

    cd :: a -> Int -> IO TVirtualPad 

    getFrame :: a -> IO TFrame 

    modified :: a -> Int -> IO () 

    range :: a -> Double -> Double -> Double -> Double -> IO () 

instance Existable TVirtualPad where
  data Exist TVirtualPad = forall a. (FPtr a, ITVirtualPad a) => ETVirtualPad a

upcastTVirtualPad :: (FPtr a, ITVirtualPad a) => a -> TVirtualPad
upcastTVirtualPad h = let fh = get_fptr h
                          fh2 :: ForeignPtr RawTVirtualPad = castForeignPtr fh
                      in cast_fptr_to_obj fh2