# File src/library/base/R/userhooks.R # Part of the R package, http://www.R-project.org # # Copyright (C) 1995-2015 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ ## presumed small .userHooksEnv <- new.env(hash = FALSE, parent = baseenv()) packageEvent <- function(pkgname, event=c("onLoad", "attach", "detach", "onUnload")) { event <- match.arg(event) pkgname <- strsplit(pkgname, "_", fixed=TRUE)[[1L]][1L] paste("UserHook", pkgname, event, sep = "::") } getHook <- function(hookName) get0(hookName, envir = .userHooksEnv, inherits = FALSE, ifnotfound = list()) setHook <- function(hookName, value, action = c("append", "prepend", "replace")) { action <- match.arg(action) old <- getHook(hookName) new <- switch(action, "append" = c(old, value), "prepend" = c(value, old), "replace" = if (is.null(value) || is.list(value)) value else list(value)) if (length(new)) assign(hookName, new, envir = .userHooksEnv, inherits = FALSE) else if(exists(hookName, envir = .userHooksEnv, inherits = FALSE)) remove(list=hookName, envir = .userHooksEnv, inherits = FALSE) invisible() }