public static function underscore($name)
    {
        if (!isset(self::$underscoreCache[$name])) {
            $underscoreName = strtolower(preg_replace('/(\B)([A-Z])/', '$1_$2', $name));
            self::$underscoreCache[$name] = $underscoreName;

            if (!isset(self::$camelizeCache[$underscoreName])) {
                self::$camelizeCache[$underscoreName] = $name;
            }
        }

        return self::$underscoreCache[$name];
    }