@b3m2a1 I have spent some time looking at how the kernel code is implemented, and still I end up making it up as I go. For user-facing functions I do use System-Private-Arguments to quit early and issue a message about the wrong number of arguments or wrong options.
Then I try to use an internal function, MainFunction calls iMainFunction but only returns its value if it isn't $Failed, and have a Condition so that if iMainFunction returns $Failed then MainFunction returns unevaluated
but you know all of that, maybe it isn't what you are asking
I try to stay away from mutable objects, instead making functions that return a changed object
so there is no method that changes the molecule, but instead returns a new molecule with the changes