
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_beans_Encoder__
#define __java_beans_Encoder__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace beans
    {
        class Encoder;
        class ExceptionListener;
        class Expression;
        class PersistenceDelegate;
        class Statement;
    }
  }
}

class java::beans::Encoder : public ::java::lang::Object
{

public:
  Encoder();
private:
  static void setupDefaultPersistenceDelegates();
public: // actually protected
  virtual void writeObject(::java::lang::Object *);
public:
  virtual void setExceptionListener(::java::beans::ExceptionListener *);
  virtual ::java::beans::ExceptionListener * getExceptionListener();
  virtual ::java::beans::PersistenceDelegate * getPersistenceDelegate(::java::lang::Class *);
  virtual void setPersistenceDelegate(::java::lang::Class *, ::java::beans::PersistenceDelegate *);
  virtual ::java::lang::Object * remove(::java::lang::Object *);
  virtual ::java::lang::Object * get(::java::lang::Object *);
  virtual void writeStatement(::java::beans::Statement *);
  virtual void writeExpression(::java::beans::Expression *);
public: // actually package-private
  virtual jboolean isImmutableType(::java::lang::Class *);
  virtual void putCandidate(::java::lang::Object *, ::java::lang::Object *);
private:
  static ::java::beans::PersistenceDelegate * defaultPersistenceDelegate;
  static ::java::beans::PersistenceDelegate * fakePersistenceDelegate;
  static ::java::util::HashMap * delegates;
  ::java::util::IdentityHashMap * __attribute__((aligned(__alignof__( ::java::lang::Object)))) candidates;
  ::java::beans::ExceptionListener * exceptionListener;
  jint accessCounter;
public:
  static ::java::lang::Class class$;
};

#endif // __java_beans_Encoder__
