This section describes the default binding mechanism. Almost every aspect can be customized, usually by using specialized binding subclasses.
Each combination of element namespace and local name (the universal name) is mapped to its own subclass (the element class) of amara.bindery.nodes.element_base, named based on the local name. An entity node instance, or an instance of any element class is a container, a construct upon which elements can be bound.
Each container has a set of class-level bindings for its children and (in the case of elements) attributes, maintained in the xml_child_pnames dictionary, mapping from the Python form of the name (the pname) to the universal name.
The pname in each binding is a descriptor on the container, which tracks the mapped universal name. When a bound name is requested, such as html.head, the head Python attribute request invokes its descriptor's __get__ method which iterates over the children of the html instance (html.xml_children) to match the universal name. As such, the binding is not actually stored at the instance level, but is computed upon access from the basic tree structure. This is a trade-off of build speed and memory consumption for lower access speed (because the list of children has to be traversed for each bound element access).
Accessing a bound attribute is similar, except that it traverses the owned attributes (e.xml_attributes) instead.
Manual notes
The entire point of Bindery is to reflect naming from the XML file into the Python constructs. It's not always
