// -*- mode: c++ -*-
#ifndef MiX_ATTRIBUTE_H_
#define MiX_ATTRIBUTE_H_

#include "classes.h"
#include "misc.h"
#include "XMLString.h"
#include "NamedNode.h"
#include "Value.h"
#include "extern/noncopyable.hpp"

namespace MiX{

  template <class charT,class char_traits,class xml_traits>
  class Attribute : boost::noncopyable,
		    public Value<charT,char_traits,xml_traits> ,
		    public NamedNode<charT,char_traits,xml_traits>{
  public:
    MiX_Template_Typedef(charT,char_traits,xml_traits);
    typedef Attribute<charT,char_traits,xml_traits> this_type;
    typedef typename nodelist_type::iterator nodelist_iter; 
  private:
    const static typename nodelist_type::iterator dmy_it;
  protected:
    /**
     * コンストラクタ
     *
     * Attributeのコンストラクタは直接呼べません<br>
     * Attribute<...>::createで生成してください
     */
    Attribute(const string_type& name,const string_type ns,const string_type& val)
      : Value<charT,char_traits,xml_traits>(val),
	NamedNode<charT,char_traits,xml_traits>(name,ns){ };
    Attribute(const string_type& name,const string_type& val)
      : Value<charT,char_traits,xml_traits>(val),
	NamedNode<charT,char_traits,xml_traits>(name){ };
  public:
    ///デストラクタ
    virtual ~Attribute()throw() { };
    ///このノードのタイプを得ます
    virtual NodeType getType()const { return Node_Attribute; };
    /**
     * 静的にクラスからNodeTypeを得ます.
     *
     * 常にNode_Attributeを返します
     */
    static NodeType type(){ return Node_Attribute; };

    string_type getFullName() const;
    /**
     * このAttributeの文字列表現を得ます.
     *
     * 引数は全て無視されます
     */
    virtual string_type toString(bool dmy=false,int dmy2=0)const;

    /**
     * このAttributeを複製します
     *
     *  \param parent 複製先の親ノード
     */
    node_type& clone(nodecontainer_type& parent,const nodelist_iter& it=dmy_it) const
      { return create(getName(),getURL(),getValue(),parent); };

    /**
     * Attributeを生成します.
     *
     * \param key 生成するAttributeの名前
     * \param val 生成するAttributeの値
     * \param parent 生成するAttributeの親ノード
     */
    static this_type& create(const string_type& key,const string_type& val,nodecontainer_type& parent) 
      { this_type::create(key,string_type(),val,parent); }
    /**
     * Attributeを生成します.
     *
     * \param key 生成するAttributeの名前
     * \param ns 生成するAttributeの名前空間のURL
     * \param val 生成するAttributeの値
     * \param parent 生成するAttributeの親ノード
     */
    static this_type& create(const string_type& key,const string_type& ns,const string_type& val,nodecontainer_type& parent);
    
    friend class DOM_Parser<charT,char_traits,xml_traits>;
  };
}

#ifndef MiX_ATTRIBUTE_CPP_
#include "Attribute.cpp"
#endif

#endif
