neon-sys 0.1.10

Exposes Node and V8 C++ API's for use by Neon.
#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