Hrm. I had honestly never considered derivative works. I'll need to think about it; I've always been a fan of complete open-source CC style licenses, but I'm afraid of too many incompatible ModuleManager derivatives cluttering things up and leaving me a debugging nightmare.

HOWEVER, since ModuleManager seems to be highly stable at this point, I don't see much reason not to release it into the wild and see what kind of mutant offspring it produces.

From this point forward, I'm releasing ModuleManager's source under a CC share-alike license. Anyone is free to do anything they like with ModuleManager's source, with two caveats:

1. You credit me as the original creator that your code is based on
2. You make it ABSOLUTELY CLEAR that your code is not the original ModuleManager, and that any problems that people have with your fork should be taken up with YOU, not me.

Beyond those caveats, knock yourselves out, but in the interest of politeness and code extensibility, it would be nice if people who are writing wildcard systems could make them interface with and extend the ModuleManager.dll assembly, rather than overwriting it. I.e.: ModuleManager.dll should give you all the tools necessary to do ConfigNode merging and exact-match ConfigNode referencing, so please make a module that *interfaces* with ModuleManager.dll rather than making your own DLL that *replaces* ModuleManager.dll, or we'll BOTH have a nightmare horde of angry and confusing users who don't know who to yell at when things break.

And since the wildcard genie is out of the bottle and I'm not responsible for granting its wishes, I'll go ahead and muse how I think wildcarding SHOULD work. I think your ideal syntax looks something like this:

Code:

@PART[*]:HAS(@MODULE[ModuleEngines]:HAS(PROPELLANT[Oxidizer]), @MODULE[ModuleAlternator], !MODULE[ModuleGimbal])
{
}

That would apply itself to any PART that contains both a ModuleAlternator and a ModuleEngines MODULE and DOESN'T contain a ModuleGimbal, but only if the ModuleEngines contains an Oxidizer PROPELLANT.

I think the IF/AND/OR stuff sounds like a good idea at first, but you'll inevitably wind up over-engineering it. Really you just need AND and NOT; OR can be handled by making multiple cases. 