## ----echo=FALSE, message=FALSE------------------------------------------------
library(Biobase)

## -----------------------------------------------------------------------------
getClass("eSet")

## -----------------------------------------------------------------------------
getValidity(getClass("eSet"))

## ----eval=FALSE---------------------------------------------------------------
#  obj <- new("ExpressionSet",
#             phenoData = new("AnnotatedDataFrame"),
#             experimentData = new("MIAME"), annotation = character(),
#             exprs = new("matrix"))

## ----eval=FALSE---------------------------------------------------------------
#  assayDataNew("environment", elt)

## ----warning=FALSE------------------------------------------------------------
data(sample.ExpressionSet)
storageMode(sample.ExpressionSet) 
tryCatch(assayData(sample.ExpressionSet)$exprs <- log(exprs(sample.ExpressionSet)), 
    error=function(err) cat(conditionMessage(err))) 

## ----eval=FALSE---------------------------------------------------------------
#  exprs(sample.ExpressionSet) <- log(exprs(sample.ExpressionSet))`

## -----------------------------------------------------------------------------
getClass("ExpressionSet") 
getValidity(getClass("ExpressionSet")) 

## -----------------------------------------------------------------------------
setClass("SwirlSet", contains="eSet") 

## ----message=FALSE------------------------------------------------------------
setMethod("initialize", "SwirlSet",
          function(.Object,
                   R = new("matrix"),
                   G = new("matrix"),
                   Rb = new("matrix"),
                   Gb = new("matrix"),
                   ...) {
            callNextMethod(.Object,
                           R=R, G=G, Rb=Rb, Gb=Gb,
                           ...) 
            }) 

## -----------------------------------------------------------------------------
setMethod("initialize", "SwirlSet",
          function(.Object,
                   assayData=assayDataNew(
                   R=R, G=G, Rb=Rb, Gb=Gb),
                   R = new("matrix"),
                   G = new("matrix"),
                   Rb = new("matrix"),
                   Gb = new("matrix"),
                   ...) {
              if (!missing(assayData) &&
                  any(!missing(R), !missing(G), !missing(Rb), !missing(Gb))) {
                  warning("using 'assayData'; ignoring 'R', 'G', 'Rb', 'Gb'")
              }
              callNextMethod(.Object, assayData=assayData, ...)
          })

## ----eval=FALSE---------------------------------------------------------------
#  new("SwirlSet")

## ----eval=FALSE---------------------------------------------------------------
#  setMethod("initialize", "MySet",
#            function(.Object, ...) {
#                .Object <- callNextMethod(.Object, ...)
#            })

## -----------------------------------------------------------------------------
setValidity("SwirlSet", function(object) {
    assayDataValidMembers(assayData(object), c("R", "G", "Rb", "Gb"))
})

## ----eval=FALSE---------------------------------------------------------------
#  myFancyFunction <- function(obj) {
#      assayData(obj) <- fancyAssaydData # obj invalid...
#      phenoData(obj) <- justAsFancyPhenoData # but now valid
#      validObject(obj)
#      (obj)
#  }

## -----------------------------------------------------------------------------
data(sample.ExpressionSet) 
classVersion(sample.ExpressionSet) 
obj <- updateObject(sample.ExpressionSet)

## -----------------------------------------------------------------------------
isCurrent(sample.ExpressionSet)[c("eSet", "ExpressionSet")]

## -----------------------------------------------------------------------------
setClass("MySet",
         contains = "eSet",
         prototype = prototype(new("VersionedBiobase",
                               versions=c(classVersion("eSet"), MySet="1.0.0"))))
obj <- new("MySet")
classVersion(obj)

## -----------------------------------------------------------------------------
 setClass("MySet",
          contains = "eSet",
          prototype = prototype( 
              new("VersionedBiobase",
                  versions=c(classVersion("eSet"), MySet="1.0.1"))))
isCurrent(obj)

## -----------------------------------------------------------------------------
setMethod("updateObject", signature(object="MySet"),
          function(object, ..., verbose=FALSE) {
              if (verbose) message("updateObject(object = 'MySet')")
                  object <- callNextMethod()
              if (isCurrent(object) ["MySet"]) return(object)
              ## Create an updated instance.
              if (!isVersioned(object))
                  ## Radical surgery – create a new, up-to-date instance
                  new("MySet",
                      assayData = updateObject(assayData(object),
                          ..., verbose=verbose),
                      phenoData = updateObject(phenoData(object),
                          ..., verbose=verbose),
                      experimentData = updateObject(experimentData(object),
                          ..., verbose=verbose),
                      annotation = updateObject(annotation(object),
                          ..., verbose=verbose))
              else {
                  ## Make minor changes, and update version by consulting class definition
                  classVersion(object)["MySet"]<-
                  classVersion("MySet")["MySet"]
                  object
              }
          })

## -----------------------------------------------------------------------------
classVersion(updateObject(obj))

## -----------------------------------------------------------------------------
classVersion(new("AnnotatedDataFrame"))

## -----------------------------------------------------------------------------
setClass("SwirlSet", contains = "eSet",
         prototype = prototype(
             new("VersionedBiobase",
                 versions=c(classVersion("eSet"), SwirlSet="1.0.0"))))
classVersion(new("SwirlSet"))

## -----------------------------------------------------------------------------
obj <- new("SwirlSet")
classVersion(obj)["MyID"] <- "0.0.1"
classVersion(obj)

## -----------------------------------------------------------------------------
 classVersion(updateObject(obj))

## -----------------------------------------------------------------------------
sessionInfo()