#ifndef NEON_CLASS_METADATA_H_
#define NEON_CLASS_METADATA_H_
#include "v8.h"
class NeonClassConstructorMetadata {
protected:
void *kernel_;
private:
v8::Global<v8::FunctionTemplate> constructor_template_;
};
class NeonBaseClassConstructorMetadata: public NeonClassConstructorMetadata {
};
class NeonDerivedClassConstructorMetadata: public NeonClassConstructorMetadata {
};
// Reflective metadata for a Neon class's constructor function..
class NeonConstructorMetadata {
public:
NeonConstructorMetadata(void *cb = nullptr) {
constructor_kernel_ = cb;
}
// FIXME: take isolate parameter
void SetConstructorTemplate(v8::Local<v8::FunctionTemplate> ct) {
constructor_template_.Reset(v8::Isolate::GetCurrent(), ct);
constructor_template_.SetWeak(this, Finalize, v8::WeakCallbackType::kParameter);
}
// FIXME: take isolate parameter
v8::Local<v8::FunctionTemplate> GetConstructorTemplate() {
return v8::Local<v8::FunctionTemplate>::New(v8::Isolate::GetCurrent(), constructor_template_);
}
void *GetConstructorKernel() {
return constructor_kernel_;
}
private:
~NeonConstructorMetadata() {
constructor_template_.Reset();
}
static void Finalize(const v8::WeakCallbackInfo<NeonConstructorMetadata>& data) {
NeonConstructorMetadata *nc = data.GetParameter();
delete nc;
}
void *constructor_kernel_;
v8::Global<v8::FunctionTemplate> constructor_template_;
};
#endif