.packageName <- "exprExternal"
setClass("exprExternal", contains = "exprSet")

setMethod("initialize",
          signature(.Object = "exprExternal"),
          function (.Object, ...) 
      {
          .Object <- callNextMethod()
          exprs(.Object) <- exprs(.Object)
          se.exprs(.Object) <- se.exprs(.Object)
          .Object
      })

setReplaceMethod("exprs", "exprExternal",
                 function(object, value) {
                     value <- as(value, "indirectExternalMatrix")
                     callNextMethod()
                 })

setReplaceMethod("exprs",
                 signature(object="exprExternal",
                           value="indirectExternalMatrix"),
                 function(object, value) {
                     callNextMethod()
                 })

setReplaceMethod("se.exprs",
                 signature(object="exprExternal",
                           value="indirectExternalMatrix"),
                 function(object, value) {
                     callNextMethod()
                 })

setMethod("write.exprs", signature(x="exprExternal"),
          function(x,file = "tmp.txt",
                   append = FALSE, quote = FALSE, sep = "\t",
                   eol = "\n", na = "NA", dec = ".", row.names = TRUE,
                   col.names = TRUE, qmethod = c("escape", "double"))
          write.table(as.Rvector(exprs(x)),
                      file = file, append = append,
                      quote = quote,
                      sep = sep,eol = eol, na = na, dec = dec,
                      row.names = row.names, col.names = col.names,
                      qmethod = qmethod))

setMethod("exprs2excel", signature(x="exprExternal"),
          function(x,file = "tmp.csv",
                   append = FALSE, quote = FALSE, sep = ",",
                   eol = "\n", na = "NA", dec = ".", row.names = TRUE,
                   col.names = NA, qmethod = c("escape", "double"))
          write.table(as.Rvector(exprs(x)),
                      file = file, append = append,
                      quote = quote,
                      sep = sep,eol = eol, na = na, dec = dec,
                      row.names = row.names, col.names = col.names,
                      qmethod = qmethod))

setAs("exprSet", "exprExternal",
      function(from, to)
  {
      to <- new('exprExternal')
      exprs(to) <- exprs(from)
      se.exprs(to) <- se.exprs(from)
      phenoData(to) <- phenoData(from)
      description(to) <- description(from)
      annotation(to) <- annotation(from)
      notes(to) <- notes(from)
      to
  })

# setAs("exprExternal", "exprSet",
#       function(from, to)
#   {
#       mat.exprs <- exprs(from)
#       mat.se <- se.exprs(from)
#       class(from) <- "exprSet"
#       attr(from, "exprs.ext") <- NULL
#       attr(from, "se.exprs.ext") <- NULL
#       from@exprs <- force(mat.exprs)[,,drop=FALSE]
#       from@se.exprs <- force(mat.se)[,,drop=FALSE]
#       from
#   },
#       function(from, value)
#   {
#       mat.exprs <- externalMatrix(from@exprs,
#                                   nrow = nrow(from@exprs),
#                                   ncol = ncol(from@exprs),
#                                   dimnames = dimnames(from@exprs))
#       mat.se.exprs <- externalMatrix(from@se.exprs,
#                                      nrow = nrow(from@se.exprs),
#                                      ncol = ncol(from@se.exprs),
#                                      dimnames = dimnames(from@se.exprs))
#       from@exprs.ext <- as(mat.exprs, 'indirectExternalMatrix')
#       from@se.exprs.ext <- as(mat.se.exprs, 'indirectExternalMatrix')
#       from@phenoData <- from@phenoData
#       from@description <- from@description
#       from@annotation <- from@annotation
#       from@notes <- from@notes
#       from
#   })

setMethod("iter", signature(object="exprExternal", covlab="missing", f="function"),
   function(object, covlab, f) {
      apply(exprs(object), 1, f)
   }
)

.First.lib <- function(libname, pkgname) {

    if(.Platform$OS.type == "windows" && require("Biobase") && interactive()
        && .Platform$GUI ==  "Rgui"){
        addVigs2WinMenu("exprExternal")
    }

}
