--- title: "Defining custom feature flags" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Defining custom feature flags} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` # Introduction In this document the process of implementing custom feature flags is presented. In the subsequent sections we will create a feature flag that is enabled if it's `number` field is odd. ## Functions to be implemented Each feature flag requires 1 function to be implemented: * `is_enabled.` - S3 method computing whether the feature flag is enabled However, it is recommended to additionally include: * `create__feature_flag` - function that creates an instance of your feature flag (note: this function can be called however you want, this is just a suggestion) * `is_` - function that returns TRUE if the passed object is an instance of the feature flag class (that we are currently defining) ## Create feature flag function Let's start with a construction method that will use create a base feature flag, add the `number` field to it and assign it to the proper class. ```{r} library(featureflag) create_odd_feature_flag <- function(number) { flag <- create_feature_flag() flag$number <- number class(flag) <- c("odd_feature_flag", class(flag)) flag } ``` ## Class checking function Next, we will create a function checking the class attribute of the object. ```{r} is_odd_feature_flag <- function(feature_flag) { inherits(feature_flag, "odd_feature_flag") } ``` ## is_enabled function Finally, we define the `is_enabled` function which checks whether the `number` field of our flag is odd. ```{r} is_enabled.odd_feature_flag <- function(feature_flag) { stopifnot(is_odd_feature_flag(feature_flag)) (feature_flag$number %% 2) != 0 } ``` Now, let's test if everything is working ```{r} my_odd_feature_flag <- create_odd_feature_flag(number = 3) if (is_enabled(my_odd_feature_flag)) { print("The feature flag is on!") } ```