func NewCachedByteCodeLoader(
	cache Cache,
	cacheLevel CacheStrategy,
	fetcher TemplateFetcher,
	parser parser.Parser,
	compiler compiler.Compiler,
) *CachedByteCodeLoader {
	return &CachedByteCodeLoader{
		NewStringByteCodeLoader(parser, compiler),
		NewReaderByteCodeLoader(parser, compiler),
		fetcher,
		[]Cache{MemoryCache{}, cache},
		cacheLevel,
	}
}
func NewCachedByteCodeLoader(
	cache Cache,
	cacheLevel CacheStrategy,
	fetcher TemplateFetcher,
	parser parser.Parser,
	compiler compiler.Compiler,
) *CachedByteCodeLoader {
	return &CachedByteCodeLoader{
		NewStringByteCodeLoader(parser, compiler),
		NewReaderByteCodeLoader(parser, compiler),
		fetcher,
		[]Cache{MemoryCache{}, cache},
		cacheLevel,
	}
}
// NewCachedByteCodeLoader creates a new CachedByteCodeLoader