Besides reading and writing primitive values like numbers and strings, primer is also able to intelligently move aggregate objects to and from lua as tables.
This is accomplished by a number of (opt-in) partial-specializations of the
primer::traits::read and primer::traits::push
traits for these container types.
Because of the overall design, this makes primer able to recognize such containers
as function parameters in API callbacks, or to pass such containers as arguments
to calls to bound_function
function objects. (See design.)
Primer can also give nice semantics to optional types like boost::optional, or std::optional
from C++17. In primer, these types can be used to specify that a table member
or function parameter is permitted to be missing, and that it is not an error
if it could not be read.