protected T Invoke <T>(CPPModel model) where T : BaseCPPModelVisitor, new()
        {
            var result = Resolve <T>();

            if (model != null)
            {
                result.Visit(model);
            }

            return(result);
        }
 public override void DefaultVisit(CPPModel model)
 {
     Unsupported(model, $"Unsupported node type");
 }
        // Base boilerplate

        protected void Unsupported(CPPModel model, string message)
        {
            throw new Exception($"[{GetType().Name}] {model.GetType().Name} ({model}): {message}");
        }