A decorator is a function that receives a function, extends its behaviour, and returned the altered function. Any caller that uses the decorated function uses the same interface as it were the original, undecorated function.
validate_arguments
decorator
## Define a functions that averages two numbers
average_two_numbers <- function(a = NA_real_, b = NA_real_) mean(c(a, b))
## Before: Averaging two nun-numeric values returns NA and prompts a warning
average_two_numbers(a = "1", b = "2")
#> [1] NA
## Decorating average_two_numbers() with validate_arguments() checks input types
average_two_numbers <- decorators::validate_arguments(average_two_numbers)
## After: Averaging two nun-numeric prompts an informative error
average_two_numbers(a = "1", b = "2")
#> Error in average_two_numbers(a = "1", b = "2") :
#> a is of type `character` rather than `numeric`!