/*
 * The contents of this file are subject to the Netscape Public
 * License Version 1.1 (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.mozilla.org/NPL/

 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.

 * The Original Code is Rhino code, released
 * May 6, 1999.

 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1997-1999 Netscape Communications Corporation. All
 * Rights Reserved.

 * Contributor(s): 

 * Alternatively, the contents of this file may be used under the
 * terms of the GNU Public License (the "GPL"), in which case the
 * provisions of the GPL are applicable instead of those above.
 * If you wish to allow use of your version of this file only
 * under the terms of the GPL and not to allow others to use your
 * version of this file under the NPL, indicate your decision by
 * deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL.  If you do not delete
 * the provisions above, a recipient may use your version of this
 * file under either the NPL or the GPL.
 */
#ifndef _JS_SCRIPTABLE_H_
#define _JS_SCRIPTABLE_H_

#include "js-instanceof.h"
#include "js-gcnew.h"

/* Classes */
class JSScriptable: public JSGCNew, public JSInstanceOf { /* GC collectable */
    public:
	/* script methods */
	/**
	 * Get the name of the set of objects implemented by this Java class.
	 * This corresponds to the [[Class]] operation in ECMA and is used
	 * by Object.prototype.toString() in ECMA.<p>
	 * See ECMA 8.6.2 and 15.2.4.2.
	 */  
	virtual jsString_t
			getClassName(JSContext *cx) = 0;
	virtual jsBool_t
			get(JSContext *cx, jsString_t name, JSScriptable *start,
				jsVal_t * value) = 0;
	virtual jsBool_t
			get(JSContext *cx, int index, JSScriptable *start,
				jsVal_t * value) = 0;
	virtual jsBool_t
			has(JSContext *cx, jsString_t name,
				JSScriptable *start) = 0;
	virtual jsBool_t
			has(JSContext *cx, int index, JSScriptable *start) = 0;
	virtual void	put(JSContext *cx, jsString_t name, JSScriptable *start,
				jsVal_t value) = 0;
	virtual void	put(JSContext *cx, int index, JSScriptable *start,
				jsVal_t value) = 0;
	virtual void	del(JSContext *cx, jsString_t name) = 0;
	virtual void	del(JSContext *cx, int index) = 0;
	virtual JSScriptable
			*getPrototype(JSContext *cx) = 0;
	virtual void	setPrototype(JSContext *cx,
				JSScriptable *prototype) = 0;
	virtual JSScriptable
			*getParentScope(JSContext *cx) = 0;
	virtual void	setParentScope(JSContext *cx, JSScriptable *parent) = 0;
	virtual jsVal_t	*getIds(JSContext *cx, int *numIds) = 0;

	/**
	 * Get the default value of the object with a given hint.
	 * The hints are String.class for type String, Number.class for type
	 * Number, Scriptable.class for type Object, and Boolean.class for
	 * type Boolean. 
	 *   
	 * A hint of null means "no hint".
	 *   
	 * See ECMA 8.6.2.6.
	 *   
	 */  
	virtual jsVal_t	getDefaultValue(JSContext *cx, jsType_t hint) = 0;
	virtual jsBool_t
			hasInstance(JSContext *cx, JSScriptable *instance) = 0;

	/* gc methods */
	void	mark(JSContext *cx);
};

#endif /* _JS_SCRIPTABLE_H_ */
