# Documenting S4

There are three things that you might document for S4:

- Generics: document as functions; mention that they are generics.
- Methods: unlike S3/S7, all S4 methods must be documented.
- Classes: document the class definition and use `@slot` for slots.

## Generics

S4 generics are functions, so document them as such. `@export` a generic if you want users to call it or other developers to write methods for it. If the generic is internal, you don’t need to export or document it.

## Classes

Document S4 classes by adding a roxygen block before `setClass()`. `@export` a class if you want users to create instances or other developers to extend it (e.g. by creating subclasses). Internal classes don’t need documentation. Use `@slot` to document the slots of the class. Here’s a simple example:

    #' An S4 class to represent a bank account
    #'
    #' @slot balance A length-one numeric vector
    #' @export
    Account <- setClass("Account", slots = list(balance = "numeric"))

## Methods

S4 methods are a little more complicated. Unlike S3 and S7 methods, all S4 methods must be documented. You only need to `@export` a method if the generic lives in another package.

You can document methods in three places:

- In the class. Most appropriate if the corresponding generic uses single dispatch and you created the class.

- In the generic. Most appropriate if the generic uses multiple dispatches and you control it.

- In its own file. Most appropriate if the method is complex or the either two options don’t apply.

Use either `@rdname` or `@describeIn` to control where method documentation goes. See `vignette("reuse")` for more details.