protected function modelLoader($objType = null)
    {
        if ($objType === null) {
            $objType = $this->objType();
        } elseif (!is_string($objType)) {
            throw new InvalidArgumentException(
                'Object type must be a string.'
            );
        }

        if (isset(self::$modelLoaders[$objType])) {
            return self::$modelLoaders[$objType];
        }

        self::$modelLoaders[$objType] = new ModelLoader([
            'logger'    => $this->logger,
            'obj_type'  => $objType,
            'factory'   => $this->modelFactory(),
            'cache'     => $this->cachePool()
        ]);

        return self::$modelLoaders[$objType];
    }