__args_as_attributes(self)
Validate the arguments passed to the constructor against the spec for
the factory (necessary because we use *args and so the user doesn't
get the feedback they will expect if they make a mistake).
Validate the arguments passed to the constructor against the spec for
the factory (necessary because we use *args and so the user doesn't
get the feedback they will expect if they make a mistake). As a side
effect we also associated arguments with names and expand defaults
so that attributes are more predictable.