public static <TRAIT extends Document> TRAIT viewOf(
            Document document,
            Class<TRAIT> trait,
            TraitViewConstructor<? extends TRAIT> constructor) {
        
        if (trait.isInstance(document)) {
            return trait.cast(document);
        } else {
            
            final Class<? extends Document> mainInterface;
            
            if (document instanceof HasMainInterface) {
                mainInterface = ((HasMainInterface) document).mainInterface();
            } else {
                mainInterface = trait;
            }
            
            return constructor.create(
                document.getParent().orElse(null), 
                document.getData(),
                mainInterface
            );
        }
    }
Returns a view of the specified document that implements the specified
trait. The returned document might or might not be the same instance as
was inputted to this method. If not, the instance will be initialized
using the specified constructor.

@param <TRAIT>      the trait class
@param document     the document to create a view of
@param trait        the trait type
@param constructor  constructor to use for documents that lack the trait
@return             the view of the trait
runtime-parent/runtime-config/src/main/java/com/speedment/runtime/config/util/TraitUtil.java