# `PropertyTable.Matcher`
[🔗](https://github.com/nerves-project/property_table/blob/v0.3.4/lib/property_table/matcher.ex#L5)

Behaviour for customizing the Matcher logic for filtering and dispatching events

# `check_pattern`

```elixir
@callback check_pattern(PropertyTable.pattern()) :: :ok | {:error, Exception.t()}
```

Check whether a pattern is valid

Returns `:ok` on success or `{:error, error}` where `error` is an `Exception` struct with
information about the issue.

# `check_property`

```elixir
@callback check_property(PropertyTable.property()) :: :ok | {:error, Exception.t()}
```

Check whether a property is valid

Returns `:ok` on success or `{:error, error}` where `error` is an `Exception` struct with
information about the issue.

# `match_spec`
*optional* 

```elixir
@callback match_spec(PropertyTable.pattern()) :: [{tuple(), [term()], [term()]}] | :error
```

Build an ETS match-spec for `pattern`

This is an optional callback. When implemented, `PropertyTable.match/2` will
call it to obtain a match-spec and run the scan with `:ets.select/2`. This can
be much faster on large tables than iterating over rows calling `matches?/2`.
Return `:error` to fall back to the generic `matches?/2` path.

The match-spec must handle `{property, value, meta}` triples. Return
rows unmodified by specifying `[:"$_"]` in the third tuple element.

# `matches?`

```elixir
@callback matches?(PropertyTable.pattern(), PropertyTable.property()) :: boolean()
```

Returns true if the pattern matches the specified property

---

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