This method, of course, carries some risks. Computational complexity goes up a bit, and there is more of a chance that a mistake will made causing an infinite loop. Infinite loops were possible in the original design, of course, but this just makes it more likely. (An infinite loop occurs when a module has for one of it's sources a module chain that calls the module itself, causing it to be called over and over again.)
However, aside from the risks and tradeoffs, I'm happy with the results. I can select any of the possible basis functions for any of the layers of a fractal method. Currently, the choices for basis functions are still a bit limited. They include:
1,2,3 dimensional value noise
1,2,3 dimensional gradient noise
1,2,3 dimensional value/gradient (sum) noise
1,2,3 dimensional simplex noise
1,2,3 dimensional voronoi (crackle) noise
1,2,3 dimensional cellular noise, specifiable coefficients for F1,F2,F3,F4
1,2,3 dimensional white noise (chaotic)
Various patterns and shapes including: sphere, cone, cylinder, bars, checkerboard, radiating sine waves, lateral sine waves, dots on a lattice, and a few others in progress
Any of the above basis functions can be chained as-is with other combiner/modifier/transformer modules including:
Combiner operations (sum, subtract, multiply a list of modules, fractal methods, max, min, selection, blending, etc...)
Transform operations (rotate, scale, translate, or turbulence applied to domain)
Modifier operations (power function, gain/bias, scale and translate output, stair-stepping, invert, clamp, abs, map to curve, map to exponential function)
All of the combiner/translator/modifier operations are defined as modules that can be set as sources for other modules.
The following image is a collage of fractals constructed randomly. Each fractal is one of: Ridged, Billow, fBm, hybrid multifractal and each is composed of 8 octaves of basis functions drawn randomly from the set of: Value3D, Gradient3D, Simplex3D, ValueGradient3D, Cellular3D. Each octave has applied to it a domain rotation of a randomly determined angle around a randomly determined axis, to mitigate any possible axis-aligned artifacts. The rotation is applied using the Rotate module. The coefficients for the Cellular3D noise were randomly selected from the set [-1,1] for some of the fractals; for others, they were hard-set to (-1,1,0,0) for F1,F2,F3 and F4.
I constructed a simple composer routine to build the fractals and dump them into an image and this was the result. Some pretty interesting functions in there, and the possibilities are endless.

I've been tinkering with wavelet noise which I might add to the set just for completeness. Simulation noise has also entered my radar, although I've done very little research on it as yet. I also have planned numerous other shape and pattern based function sources.
Being able to use any basis function for each octave of a fractal is a really cool idea.