/// <summary>
        /// A Unity callback called when the object is loaded.
        /// </summary>
        void OnEnable () {
            m_Tree = target as InternalBehaviourTree;
            BehaviourWindow.activeNodeChanged += this.ActiveNodeChanged;

            m_StatesEditor = new ParentStatesEditor(m_Tree, serializedObject.FindProperty("m_Position"));

            // Try to create an editor for the current active node
            this.ActiveNodeChanged();
        }
        /// <summary> 
        /// Paste the node in BehaviourTreeUtility.nodeToPaste in the supplied tree.
        /// <param name="tree">The target tree.</param>
        /// <param name="parent">Optional parent to paste the node; or null to paste as a root node.</param>
        /// <returns>The pasted node.</returns>
        /// </summary>
        public static ActionNode PasteNode (InternalBehaviourTree tree, BranchNode parent = null) {
            // Get the node to be pasted
            var node = BehaviourTreeUtility.nodeToPaste;

            // Validate parameters
            if (node != null && tree != null) {
                // Register Undo
                #if UNITY_4_0_0 || UNITY_4_1 || UNITY_4_2
                Undo.RegisterUndo(tree,"Paste Node");
                #else
                Undo.RecordObject(tree,"Paste Node");
                #endif

                var newNode = node.Copy(tree);

                if (newNode != null) {
                    // Add to parent branch?
                    if (parent != null) {
                        parent.Add(newNode);

                        // Call OnValidate on the parent
                        parent.OnValidate();
                    }

                    // Saves node and sets dirty flag
                    StateUtility.SetDirty(tree);

                    // Reload tree to update variables
                    tree.LoadNodes();
                }
                return newNode;
            }
            return null;
        }
        /// <summary> 
        /// Adds a new node to the tree, automatically handles undo, dirty flag and save node.
        /// <param name="tree">The tree to add a new node.</param>
        /// <param name="nodeType">The type of the new node.</param>
        /// <returns>The new node.</returns>
        /// </summary>
        public static ActionNode AddNode (InternalBehaviourTree tree, System.Type nodeType) {
            // Validate parameters
            if (tree != null && nodeType != null && nodeType.IsSubclassOf(typeof(ActionNode)) && !nodeType.IsAbstract) {
                // Register Undo
                #if UNITY_4_0_0 || UNITY_4_1 || UNITY_4_2
                Undo.RegisterUndo(tree,"Add New Node");
                #else
                Undo.RecordObject(tree,"Add New Node");
                #endif

                // Create new node
                var newNode = tree.AddNode(nodeType);

                if (newNode != null) {                    
                    // Saves node and sets dirty flag
                    StateUtility.SetDirty(tree);
                    return newNode;
                }
            }

            return null;
        }