Documentation updates/fixes
[senf.git] / senf / Utils / Console / Node.hh
index 7bf1882..a6d64c4 100644 (file)
@@ -58,7 +58,7 @@
             dir.doc("Manager for something");
 
             // Add a member function (the pointer-to-member is automatically bound to this instance)
-            dir.add("member", fty::Command(this, &SomeClass::member)
+            dir.add("member", fty::Command(&SomeClass::member, this)
                 .doc("Do the member operation"));
         }
 
     \code
     void callback(std::ostream & os, senf::console::ParseCommandInfo const & command) { ... }
     // ...
-    myDirectory.add("foo",&callback);
+    myDirectory.add("foo",fty::Command(&callback));
     \endcode
 
     Every node is identified among it's siblings by it's name. The name of the node is set when
     Depending on the node type added, additional node parameters may be set. For example, every node
     has a documentation parameter which is used by the online-help system. To assign these
     parameters, the node exposes corresponding member functions. Since
-    senf::console::DirectoryNode::add() returns the newly added node by reference, additional
-    parameters may just be added to the end of the add command:
+    senf::console::DirectoryNode::add() returns the newly added node by reference. Additional
+    parameters may be added after the factory call:
     \code
-    myDirectory.add("foo",&fooCallback).doc("The foo method");
+    myDirectory.add("foo", fty::Command(&fooCallback).doc("The foo method") );
     \endcode
     Since the parameter setters all return the node reference, additional parameters may just be
     added to the end of the command.
 #include <boost/range/iterator_range.hpp>
 #include <boost/any.hpp>
 #include <senf/Utils/Exception.hh>
-#include <senf/Utils/mpl.hh>
 #include <senf/Utils/Logger/SenfLog.hh>
-#include <senf/Utils/type_traits.hh>
-#include "Parse.hh"
 
 //#include "Node.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
@@ -233,7 +230,7 @@ namespace console {
 
         Recursively dumps the console directory structure starting at \a dir. By default, dumps the
         complete tree beginning at the root node.
-        
+
         In contrast to the console 'lr' command, links are dumped by showing the \e absolute path
         to the target node.
      */
@@ -390,8 +387,8 @@ namespace console {
         This node type provides the internal and root nodes of the tree. It allows to add arbitrary
         children and supports directory traversal.
 
-        Nodes are normally not instantiated manually but are created by the DirectoryNode via
-        mkdir() or add(). Special add() members however allow externally allocated node objects.
+        Nodes are normally not instantiated manually but are created using factory calls. Special
+        add() members however allow externally allocated node objects.
 
         Nodes may be added to the tree only once, otherwise chaos will ensue. Since nodes are always
         managed dynamically, there is a special ScopedDirectory proxy template which provides a
@@ -577,7 +574,7 @@ namespace console {
                                              \param[in] command command arguments. This is a
                                                  range of ranges of Token instances. */
 
-        void execute(boost::any & rv, std::ostream & output, ParseCommandInfo const & command) 
+        void execute(boost::any & rv, std::ostream & output, ParseCommandInfo const & command)
             const;
                                         ///< Execute the command
                                         /**< \param[out] rv command return value
@@ -677,10 +674,49 @@ namespace console {
 
     DirectoryNode & provideDirectory(DirectoryNode & dir, std::string const & name);
 
-#ifndef DOXYGEN
+/** \brief Console node factories
+
+    The senf::console::factory namespace (customarily aliased to \c fty in user code) contains
+    factories used to create new node types:
+    \code
+    namespace fty = senf::console::factory;
+
+    senf::console::DirectoryNode & dir (node.add("dirname", fty::Directory()));
+
+    dir.add("name", fty::Command<void(bool)>(&fn)
+                .arg("flag")
+                .doc("documentation"));
+    \endcode
+
+    The node is added by passing the factory instance to senf::console::DirectoryNode::add().
+
+    To further customize the node, you may call attributor members on the temporary factory class
+    instance. Since the attributor members always return a self-reference to the factory class
+    instance, attributor calls may be chained arbitrarily.
+
+    \see
+        \ref console_commands for details on the command nodes \n
+        \ref node_tree for details on the structural nodes (directory, link)
+
+    \note All factories are documented here as classes when in fact some are functions returning
+        internal classes.
+
+    \implementation It is not true, that all attributor members return a self reference. Some
+        attributor members will return a new object of slightly different type. However, the
+        behavior is as documented above.
 
+    \ingroup console_commands
+ */
 namespace factory {
-    
+
+    /** \brief SimpleCommandNode factory
+
+        This factory will create a SimpleCommandNode calling the given callback. A SimpleCommandNode
+        does not support overloading or automatic argument parsing.
+
+        \attention This class is of interest mostly for testing and as a simple CommandNode
+        example. Use senf::console::factory::Command instead.
+     */
     class SimpleCommand
         : public detail::NodeFactory
     {
@@ -690,15 +726,32 @@ namespace factory {
 
         explicit SimpleCommand(SimpleCommandNode::Function fn);
 
-        SimpleCommandNode & create(DirectoryNode & dir, std::string const & name) const;
-
         SimpleCommand const & doc(std::string const & doc) const;
+                                        ///< Set simple command documentation
         SimpleCommand const & shortdoc(std::string const & doc) const;
+                                        ///< Set simple command short documentation
 
     private:
+        SimpleCommandNode & create(DirectoryNode & dir, std::string const & name) const;
+
         SimpleCommandNode::ptr node_;
+
+        friend class senf::console::DirectoryNode;
     };
 
+    /** \brief DirectoryNode factory
+
+        This factory will create new directory nodes. Use
+
+        \code
+        namespace fty = senf::console::factory;
+        node.add("mydir", fty::Directory())
+        \endcode
+
+        To add a directory \a mydir to \a node.
+
+        \see \ref node_tree
+     */
     class Directory
         : public detail::NodeFactory
     {
@@ -708,15 +761,32 @@ namespace factory {
 
         Directory();
 
-        DirectoryNode & create(DirectoryNode & dir, std::string const & name) const;
-
         Directory const & doc(std::string const & doc) const;
+                                        ///< Set directory documentation
         Directory const & shortdoc(std::string const & doc) const;
+                                        ///< Set directory short documentation
 
     private:
+        DirectoryNode & create(DirectoryNode & dir, std::string const & name) const;
+
         DirectoryNode::ptr node_;
+
+        friend class senf::console::DirectoryNode;
     };
 
+    /** \brief LinkNode factory
+
+        This factory will create new link nodes. Use
+
+        \code
+        namespace fty = senf::console::factory;
+        node.add("mylink", fty::Link(targetNode))
+        \endcode
+
+        To add a link \a mylink to \a node pointing to \a targetNode
+
+        \see \ref node_tree
+     */
     class Link
         : public detail::NodeFactory
     {
@@ -726,16 +796,16 @@ namespace factory {
 
         explicit Link(GenericNode & target);
 
+    private:
         LinkNode & create(DirectoryNode & dir, std::string const & name) const;
 
-    private:
         LinkNode::ptr node_;
+
+        friend class senf::console::DirectoryNode;
     };
 
 }
 
-#endif
-
 }}
 
 ///////////////////////////////hh.e////////////////////////////////////////