actually I just realized there is a bug, in the 2nd case of collect_fields: else static if (members[0] == "this") return []; Should be: else static if (members[0] == "this") return collect_fields!(T, attribute, members[1..$]); Otherwise the method craps out on the constructor and returns an incomplete list.