| Index: compiled/bindings/generator.h | 
| =================================================================== | 
| --- a/compiled/bindings/generator.h | 
| +++ b/compiled/bindings/generator.h | 
| @@ -175,41 +175,47 @@ namespace bindings_internal | 
| }; | 
| struct DifferentiatorInfo | 
| { | 
| size_t offset; | 
| std::vector<std::pair<int, std::string>> mapping; | 
| }; | 
| + typedef std::vector<PropertyInfo> Properties; | 
| + typedef std::vector<MethodInfo> Methods; | 
| + | 
| struct ClassInfo | 
| { | 
| TYPEID id; | 
| TYPEID baseClass; | 
| std::string name; | 
| - std::vector<PropertyInfo> properties; | 
| - std::vector<MethodInfo> methods; | 
| + Properties properties; | 
| + Methods methods; | 
| DifferentiatorInfo subclass_differentiator; | 
| ptrdiff_t ref_counted_offset; | 
| + FunctionInfo instanceGetter; | 
| }; | 
| void register_class(const char* name, TYPEID classID, TYPEID baseClassID, | 
| - ptrdiff_t ref_counted_offset); | 
| + ptrdiff_t ref_counted_offset, | 
| + const FunctionInfo& instanceGetter = FunctionInfo()); | 
| void register_property(TYPEID classID, const char* name, | 
| const FunctionInfo& getter, const FunctionInfo& setter, | 
| const char* jsValue = ""); | 
| void register_method(TYPEID classID, const char* name, | 
| const FunctionInfo& call); | 
| void register_differentiator(TYPEID classID, size_t offset, | 
| std::vector<std::pair<int, std::string>>& mapping); | 
| - std::string wrapCall(const FunctionInfo& call, bool isFunction = true); | 
| + std::string wrapCall(const FunctionInfo& call, bool isFunction = true, | 
| + const FunctionInfo& instanceGetter = FunctionInfo()); | 
| } | 
| template<typename ClassType, | 
| typename BaseClass = bindings_internal::NoBaseClass, | 
| typename std::enable_if<std::is_base_of<ref_counted, ClassType>::value>::type* = nullptr> | 
| class class_ | 
| { | 
| public: | 
| @@ -283,9 +289,50 @@ public: | 
| mapping.emplace_back(item.first, item.second); | 
| bindings_internal::register_differentiator( | 
| bindings_internal::TypeInfo<ClassType>(), offset, mapping); | 
| return *this; | 
| } | 
| }; | 
| +template<typename ClassType> | 
| +class singleton | 
| +{ | 
| +public: | 
| + singleton(const char* name, ClassType* (*instanceGetter)()) | 
| + { | 
| + bindings_internal::register_class(name, | 
| + bindings_internal::TypeInfo<ClassType>(), | 
| + bindings_internal::TypeInfo<bindings_internal::NoBaseClass>(), | 
| + 0, | 
| + instanceGetter | 
| + ); | 
| + } | 
| + | 
| + template<typename FieldType> | 
| + const singleton& property(const char* name, | 
| + FieldType (ClassType::*getter)() const, | 
| + void (ClassType::*setter)(FieldType) = nullptr) const | 
| + { | 
| + bindings_internal::register_property( | 
| + bindings_internal::TypeInfo<ClassType>(), name, getter, setter); | 
| + return *this; | 
| + } | 
| + | 
| + template<typename ReturnType, typename... Args> | 
| + const singleton& function(const char* name, ReturnType (ClassType::*method)(Args...)) const | 
| + { | 
| + bindings_internal::register_method( | 
| + bindings_internal::TypeInfo<ClassType>(), name, method); | 
| + return *this; | 
| + } | 
| + | 
| + template<typename ReturnType, typename... Args> | 
| + const singleton& function(const char* name, ReturnType (ClassType::*method)(Args...) const) const | 
| + { | 
| + bindings_internal::register_method( | 
| + bindings_internal::TypeInfo<ClassType>(), name, method); | 
| + return *this; | 
| + } | 
| +}; | 
| + | 
| void printBindings(); |