///Macro Nodes
        public static UnityEditor.GenericMenu AppendMacroNodesMenu(this FlowGraph graph, UnityEditor.GenericMenu menu, string baseCategory, Vector2 pos, Port sourcePort, object dropInstance)
        {
            var projectMacroGUIDS = UnityEditor.AssetDatabase.FindAssets("t:Macro");

            foreach (var guid in projectMacroGUIDS)
            {
                var path  = UnityEditor.AssetDatabase.GUIDToAssetPath(guid);
                var macro = (Macro)UnityEditor.AssetDatabase.LoadAssetAtPath(path, typeof(Macro));

                if (sourcePort is ValueOutput || sourcePort is FlowOutput)
                {
                    if (!macro.inputDefinitions.Select(d => d.type).Any(d => d.IsAssignableFrom(sourcePort.type)))
                    {
                        continue;
                    }
                }

                if (sourcePort is ValueInput || sourcePort is FlowInput)
                {
                    if (!macro.outputDefinitions.Select(d => d.type).Any(d => sourcePort.type.IsAssignableFrom(d)))
                    {
                        continue;
                    }
                }

                var category = baseCategory + (!string.IsNullOrEmpty(macro.category) ? "/" + macro.category : "");
                var name     = category + "/" + macro.name;

                var content = new GUIContent(name, null, macro.comments);
                if (macro != graph)
                {
                    menu.AddItem(content, false, () => { graph.AddMacroNode(macro, pos, sourcePort, dropInstance); });
                }
                else
                {
                    menu.AddDisabledItem(content);
                }
            }

            if (sourcePort == null)
            {
                menu.AddItem(new GUIContent("MACROS/Create New...", null, "Create a new macro"), false, () =>
                {
                    var newMacro = EditorUtils.CreateAsset <Macro>();
                    if (newMacro != null)
                    {
                        var wrapper   = graph.AddNode <MacroNodeWrapper>(pos);
                        wrapper.macro = newMacro;
                    }
                });
            }
            return(menu);
        }