// $Id$
//
-// Copyright (C) 2008
+// Copyright (C) 2008
// Fraunhofer Institute for Open Communication Systems (FOKUS)
// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
#include <boost/intrusive_ptr.hpp>
#include <boost/range/iterator_range.hpp>
#include <senf/Utils/intrusive_refcount.hh>
+#include <boost/optional.hpp>
//#include "OverloadedCommand.mpp"
///////////////////////////////hh.p////////////////////////////////////////
void execute(boost::any & rv, std::ostream & os, ParseCommandInfo const & command);
///< Call the overload
/**< If the \a arguments are not acceptable for this
- overload, a SyntaxErrorException must be thrown.
+ overload, a SyntaxErrorException must be thrown.
Same as operator()() */
void operator()(boost::any & rv, std::ostream & os, ParseCommandInfo const & command);
///< Call the overload
/**< If the \a arguments are not acceptable for this
- overload, a SyntaxErrorException must be thrown.
+ overload, a SyntaxErrorException must be thrown.
Same as execute() */
-
+
unsigned numArguments() const; ///< Number of arguments this overload takes
void argumentDoc(unsigned index, ArgumentDoc & doc) const;
///< Get information on argument \a index
\param[out] doc Argument documentation */
std::string doc() const; ///< Get overload documentation
-
+
OverloadedCommandNode & node() const; ///< Access owning node
/**< \pre The command \e must have been added to an
OverloadedCommandNode. */
'SyntaxErrorException' exception is thrown.
This works by first adding an OverloadedCommandNode to the directory in question and then
- adding commands to that node. Commands are derived from CommandOverload.
+ adding commands to that node. Commands are derived from CommandOverload.
\code
senf::console::DirectoryNode & dir (...);
senf::console::OverloadedCommandNode & cmd (
///@}
///////////////////////////////////////////////////////////////////////////
-
+
template <class Command>
Command & add(boost::intrusive_ptr<Command> overload); ///< Add an additional overload
ptr thisptr();
cptr thisptr() const;
+ static OverloadedCommandNode & insertOverload(DirectoryNode & dir, std::string const & name,
+ CommandOverload::ptr overload);
+
private:
OverloadedCommandNode();
/** \brief Basic command overload
This is an implementation of CommandOverload which allows to call an arbitrary callback with
- the correct signature
+ the correct signature
(<tt>void (std::ostream &, senf::console::ParseCommandInfo const &)</tt>)
*/
class SimpleCommandOverload
std::string doc_;
};
+ class SimpleOverloadAttributor
+ : public detail::NodeFactory
+ {
+ public:
+ typedef OverloadedCommandNode node_type;
+ typedef OverloadedCommandNode & result_type;
+
+ explicit SimpleOverloadAttributor(SimpleCommandOverload::Function fn);
+
+ SimpleOverloadAttributor const & doc(std::string const & doc) const;
+ SimpleOverloadAttributor const & shortdoc(std::string const & doc) const;
+ SimpleOverloadAttributor const & overloadDoc(std::string const & doc) const;
+
+ OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
+
+ private:
+ SimpleCommandOverload::ptr overload_;
+ mutable boost::optional<std::string> doc_;
+ mutable boost::optional<std::string> shortdoc_;
+ };
+
}}
///////////////////////////////hh.e////////////////////////////////////////