protected function modelLoader($objType, $objKey = null)
    {
        if (!is_string($objType)) {
            throw new InvalidArgumentException(sprintf(
                'The object type must be a string, received %s',
                get_var_type($objType)
            ));
        }

        $key = $objKey;
        if ($key === null) {
            $key = '_';
        } elseif (!is_string($key)) {
            throw new InvalidArgumentException(sprintf(
                'The object property key must be a string, received %s',
                get_var_type($key)
            ));
        }

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

        $builder = $this->modelLoaderBuilder();

        self::$modelLoaders[$objType][$key] = $builder($objType, $objKey);

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