# `Membrane.Element`
[🔗](https://github.com/membraneframework/membrane-core/blob/v1.3.0/lib/membrane/element.ex#L1)

Module containing types and functions for operating on elements.

For behaviours for elements check `Membrane.Source`, `Membrane.Filter`,
`Membrane.Endpoint` and `Membrane.Sink`.

## Behaviours
Element-specific behaviours are specified in modules:
- `Membrane.Element.WithOutputPads` - behaviour common to sources,
filters and endpoints
- `Membrane.Element.WithInputPads` - behaviour common to sinks,
filters and endpoints
- Base modules (`Membrane.Source`, `Membrane.Filter`, `Membrane.Endpoint`,
`Membrane.Sink`) - behaviours specific to each element type.

## Callbacks
Modules listed above provide specifications of callbacks that define elements
lifecycle. All of these callbacks have names with the `handle_` prefix.
They are used to define reaction to certain events that happen during runtime,
and indicate what actions framework should undertake as a result, besides
executing element-specific code.

For actions that can be returned by each callback, see `Membrane.Element.Action`
module.

# `name`

```elixir
@type name() :: tuple() | atom()
```

Type that defines an element name by which it is identified.

# `options`

```elixir
@type options() :: struct() | nil
```

Defines options that can be received in `c:Membrane.Element.Base.handle_init/2`
callback.

# `state`

```elixir
@type state() :: any()
```

Type of user-managed state of element.

# `type`

```elixir
@type type() :: :source | :filter | :endpoint | :sink
```

Defines possible element types:
- source, producing buffers
- filter, processing buffers
- endpoint, producing and consuming buffers
- sink, consuming buffers

# `element?`

```elixir
@spec element?(module()) :: boolean()
```

Checks whether module is an element.

# `is_element_name?`
*macro* 

---

*Consult [api-reference.md](api-reference.md) for complete listing*
