/* $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version
 * 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __ETCHOBJECT_H__
#define __ETCHOBJECT_H__

#include "capu/container/List.h"

#include "common/EtchError.h"
#include "common/EtchObjectType.h"

class EtchObject {
public:

  /**
   * EtchObjectType for EtchObject.
   */
  static const EtchObjectType* TYPE();

  /**
   * Constructor.
   */
  EtchObject();

  /**
   * Copy Constructor.
   */
  EtchObject(const EtchObject& other);

  /**
   * Destructor.
   */
  virtual ~EtchObject();

  /**
   */
  virtual const EtchObjectType* getObjectType() const;

  /**
   * Returns true if the type hierarchy of this instance
   * is from the given type.
   * @param type to check
   * @return true if the instance is compatible to the given type
   */
  virtual capu::bool_t isInstanceOf(const EtchObjectType* type) const;

  /**
   * Returns hash code
   */
  virtual capu::uint32_t getHashCode() const;

  /**
   * @return true if two object is equal
   *         false otherwise
   */
  virtual capu::bool_t equals(const EtchObject * other) const;

protected:
  /**
   * Adds the object type to the type hierachy of this instance.
   * @param type that should be added to type hierachy of this instance.
   */
  virtual status_t addObjectType(const EtchObjectType* type);

private:
  capu::List<const EtchObjectType*> mTypes;
};

typedef capu::SmartPointer<EtchObject> EtchObjectPtr;

#endif
