# Defining families¶

Families have a counterpart for the following entity operations: has, hasSet, and hasRelation which match against all entities where those operations would return true.

These operations be joined by three connectives, and, not, or.

## Usage¶

Families don't inline connectives (ex. A or B) since we often want to match many components at once. Thus, we use a tree structure.

Consider three components, A, B, C, let's try to build some families from them.

family {
and {
has<A>()
has<B>()
}
}

Families default to the and selector, so this is equivalent to the following:

family {
has<A>()
has<B>()
}

family {
or {
has<A>()
has<B>()
has<C>()
}
}

family {
or {
has<A>()
has<B>()
}
not {
has<C>()
}
}

family {
or {
has<A>()
has<B>()
}
not {
and {
hasRelation<ChildOf?, C?>()
}
}
}


## Getting matched entities¶

Once created, a family can check if an entity matches it with entity in family // Boolean. More importantly, we can now use them in our systems for fast pattern matching in queries.