final public function assignObjectData(
        array $objectData = [],
        $requireAnalysis = false)
    {
        // Save the provided JSON data array.
        $this->_objectData = $objectData;

        // Recursively look for missing/bad JSON properties, if scan requested.
        // NOTE: "Bad" in this case includes things like fatal mismatches
        // between the definition of a property and the actual JSON data for it.
        // NOTE: This analysis includes ALL problems with the class and its
        // entire hierarchy (recursively), which means that it can produce
        // really long error messages. It will warn about ALL missing properties
        // that exist in the data but are not defined in the class, and it will
        // warn about ALL bad properties that existed in the data but cannot be
        // mapped in the way that the class map claims.
        if ($requireAnalysis) {
            $analysis = $this->exportClassAnalysis(); // Never throws.
            if ($analysis->hasProblems()) {
                // Since there were problems, throw with all combined summaries.
                throw new LazyJsonMapperException(
                    $analysis->generateNiceSummariesAsString()
                );
            }
        }

        // Call the custom initializer, where the subclass can do its own init.
        // NOTE: This is necessary for safely encapsulating the subclass' code.
        try {
            $this->_init();
        } catch (LazyUserException $e) {
            throw $e; // Re-throw user-error as is, since it's a proper exception.
        } catch (\Exception $e) { // IMPORTANT: Catch ANY other exception!
            // Ensure that they didn't throw something dumb from their code.
            // We'll even swallow the message, to truly discourage misuse.
            throw new LazyUserException(
                'Invalid exception thrown by _init(). Must use LazyUserException.'
            );
        }
    }