introduced opaque pointer for better internal bookkeeping