def prepare(self, strict=True):
        """ preparation for loaded json

        :param bool strict: when in strict mode, exception would be raised if not valid.
        """

        self.__root = self.prepare_obj(self.raw, self.__url)
        self.validate(strict=strict)

        if hasattr(self.__root, 'schemes') and self.__root.schemes:
            if len(self.__root.schemes) > 0:
                self.__schemes = self.__root.schemes
            else:
                # extract schemes from the url to load spec
                self.__schemes = [six.moves.urlparse(self.__url).schemes]

        s = Scanner(self)
        s.scan(root=self.__root, route=[Merge()])
        s.scan(root=self.__root, route=[PatchObject()])
        s.scan(root=self.__root, route=[Aggregate()])

        # reducer for Operation
        tr = TypeReduce(self.__sep)
        cy = CycleDetector()
        s.scan(root=self.__root, route=[tr, cy])

        # 'op' -- shortcut for Operation with tag and operaionId
        self.__op = utils.ScopeDict(tr.op)
        # 'm' -- shortcut for model in Swagger 1.2
        if hasattr(self.__root, 'definitions') and self.__root.definitions != None:
            self.__m = utils.ScopeDict(self.__root.definitions)
        else:
            self.__m = utils.ScopeDict({})
        # update scope-separater
        self.__m.sep = self.__sep
        self.__op.sep = self.__sep

        # cycle detection
        if len(cy.cycles['schema']) > 0 and strict:
            raise errs.CycleDetectionError('Cycles detected in Schema Object: {0}'.format(cy.cycles['schema']))
preparation for loaded json

        :param bool strict: when in strict mode, exception would be raised if not valid.