def tree_to_nodes(tree, context=None, metadata=None):
    """Assembles ``tree`` nodes into object models.
    If ``context`` is supplied, it will be used to contextualize
    the contents of the nodes. Metadata will pass non-node identifying
    values down to child nodes, if not overridden (license, timestamps, etc)
    """
    nodes = []
    for item in tree['contents']:
        if 'contents' in item:
            sub_nodes = tree_to_nodes(item, context=context, metadata=metadata)
            if metadata is None:
                metadata = {}
            else:
                metadata = metadata.copy()
                for key in ('title', 'id', 'shortid',
                            'cnx-archive-uri', 'cnx-archive-shortid'):
                    if key in metadata:
                        metadata.pop(key)

            for key in ('title', 'id', 'shortId'):
                if item.get(key):
                    metadata[key] = item[key]
                    if item[key] != 'subcol':
                        if key == 'id':
                            metadata['cnx-archive-uri'] = item[key]
                        elif key == 'shortId':
                            metadata['cnx-archive-shortid'] = item[key]

            titles = _title_overrides_from_tree(item)
            if item.get('id') is not None:
                tbinder = cnxepub.Binder(item.get('id'),
                                         sub_nodes,
                                         metadata=metadata,
                                         title_overrides=titles)
            else:
                tbinder = cnxepub.TranslucentBinder(sub_nodes,
                                                    metadata=metadata,
                                                    title_overrides=titles)
            nodes.append(tbinder)
        else:
            doc = document_factory(item['id'], context=context)
            for key in ('title', 'id', 'shortId'):
                if item.get(key):
                    doc.metadata[key] = item[key]
                    if key == 'id':
                        doc.metadata['cnx-archive-uri'] = item[key]
                    elif key == 'shortId':
                        doc.metadata['cnx-archive-shortid'] = item[key]
            nodes.append(doc)
    return nodes