% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/register-s3.R
\name{.s3register}
\alias{.s3register}
\title{Register a method for a suggested dependency}
\usage{
.s3register(generic, class, method = NULL)
}
\arguments{
\item{generic}{Name of the generic in the form \code{pkg::generic}.}

\item{class}{Name of the class}

\item{method}{Optionally, the implementation of the method. By default,
this will be found by looking for a function called \code{generic.class}
in the package environment.

Note that providing \code{method} can be dangerous if you use
devtools. When the namespace of the method is reloaded by
\code{devtools::load_all()}, the function will keep inheriting from
the old namespace. This might cause crashes because of dangling
\code{.Call()} pointers.}
}
\value{
nothing; called for side effects
}
\description{
Generally, the recommend way to register an S3 method is to use the
\code{S3Method()} namespace directive (often generated automatically by the
\verb{@export} roxygen2 tag). However, this technique requires that the generic
be in an imported package, and sometimes you want to suggest a package,
and only provide a method when that package is loaded. \code{s3_register()}
can be called from your package's \code{.onLoad()} to dynamically register
a method only if the generic's package is loaded. (To avoid taking a
dependency on vctrs for this one function, please feel free to copy
and paste the function source into your own package.)
}
\details{
For R 3.5.0 and later, \code{s3_register()} is also useful when demonstrating
class creation in a vignette, since method lookup no longer always involves
the lexical scope. For R 3.6.0 and later, you can achieve a similar effect
by using "delayed method registration", i.e. placing the following in your
\code{NAMESPACE} file:

\if{html}{\out{<div class="sourceCode">}}\preformatted{if (getRversion() >= "3.6.0") \{
  S3method(package::generic, class)
\}
}\if{html}{\out{</div>}}
}
\examples{
# A typical use case is to dynamically register tibble/pillar methods
# for your class. That way you avoid creating a hard dependency on packages
# that are not essential, while still providing finer control over
# printing when they are used.

.onLoad <- function(...) {
  .s3Register("pillar::pillar_shaft", "vctrs_vctr")
  .s3Register("tibble::type_sum", "vctrs_vctr")
}
}
\keyword{internal}
