module tcenal.rule_selector; template apply(alias template_, args...) { alias apply = template_!args; } template createRuleSelector(string module_ = __MODULE__) { template RuleSelector(string rule, bool isSuper = false) { mixin ("static import " ~ module_ ~ ";"); static import tcenal.d.parsers; static if (isSuper || !__traits(compiles, mixin (module_ ~ "." ~ rule))) { alias RuleSelector = apply!(mixin ("tcenal.d.parsers." ~ rule), createRuleSelector!module_.RuleSelector); } else { alias RuleSelector = apply!(mixin (module_ ~ "." ~ rule), createRuleSelector!module_.RuleSelector); } } }