text: #ifndef REBECCA_FRAMEWORK_RANDOM_H
  #define REBECCA_FRAMEWORK_RANDOM_H
  
  /*
   * RebeccaAIML, Artificial Intelligence Markup Language 
   * C++ api and engine.
   *
   * Copyright (C) 2005 Frank Hassanabad
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  
  /* Disable Windows VC 7.x warning about 
   * shared_ptr needing dll-interface and
   * about it ignoring the throw specification
   */
  #ifdef _WIN32
  #    pragma warning ( push )
  #    pragma warning( disable : 4251 )
  #    pragma warning( disable : 4290 )
  #endif
  
  //Rebecca includes
  #include <rebecca/framework/InnerTemplate.h>
  
  namespace rebecca
  {
  namespace framework
  {
  namespace impl
  {
  
  /*
   * Forward declerations
   */
  
  /**
   * The private implementation in which
   * you cannot get access to.
   *
   * This class holds the private methods
   * and private attributes of this class.  This 
   * makes ABI (Application Binary Interface) more
   * resilient to change. See the private implementation
   * idiom on the internet for more information about this.
   */
  class RandomImpl;
  
  /**
   * AIML class that represents the 
   * AIML XML tag "random".  
   *
   * Every time a XML Tag of AIML is 
   * encountered, an instance of 
   * this class will be created.  All text
   * inbetween the begin and end tag, all
   * attributes, and all inner Tags will
   * go through methods of this class.
   */
  class REBECCA_EXPORT Random : public InnerTemplate
  {
  
  	public:
  
  		/** 
  		 * Default constructor to initalize 
  		 * the private implementation (m_pimpl)
  		 * data.
  		 *
  		 * \exception InternalProgrammerErrorException is thrown 
  		 * only if the error is so grave that the entire AIML 
  		 * engine has to be shut down.
  		 */
  		Random()
  			throw(InternalProgrammerErrorException &);
  		
          /**
  		 * Adds the InnerTemplate AIML XML Tag object to the 
  		 * underlying data structure.
  		 *
  		 * \param tag The InnerTemplate AIML XML Tag that is inside this AIML XML 
  		 * Tag and is to be added to this AIMl XML's underlying data structure for 
  		 * latter retrievel through Random::getString()
  		 *
  		 * \exception InternalProgrammerErrorException is thrown 
  		 * only if the error is so grave that the entire AIML 
  		 * engine has to be shut down.
  		 */
  		virtual void add(const shared_ptr<InnerTemplate> &tag) 
  			throw(InternalProgrammerErrorException &);
  
  		/**
  		 * Randomly chooses one of the tags that it added
  		 * through Random::add() and returns the InnerTemplate::getString()
  		 * on that Tag.
  		 *
  		 * \return The InnerTemplate::getString() on the randomly
  		 * choosen Tag from Random::add()
  		 *
  		 * \exception InternalProgrammerErrorException is thrown 
  		 * only if the error is so grave that the entire AIML 
  		 * engine has to be shut down.
  		 */
  		virtual StringPimpl getString() const
  			throw(InternalProgrammerErrorException &);
  
  		/** 
  		 * Default virtual destructor.  Destroys the private implementation
  		 * (m_pimpl) data.
  		 */
  		virtual ~Random();
  
  	private:
  
  	   /**
  		* The private implementation in which
  		* you cannot get access to.
  		*
  		* This shared_ptr holds the private methods 
  		* and private member variables of this class.  This 
  		* makes ABI (Application Binary Interface) more
  		* resilient to change. See the private implementation
  		* idiom on the internet for more information about this.
  		*/
  		shared_ptr<RandomImpl> m_pimpl;
  		
  };
  
  } //end of namespace impl
  
  //Expose just the class name to the framework namespace
  using rebecca::framework::impl::Random;
  
  } //end of namespace framework
  } //end of namespace rebecca
  
  #ifdef _WIN32
  #    pragma warning ( pop )
  #endif
  
  #endif
  