qml 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +46 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +15 -0
  5. data/.yardopts +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +351 -0
  9. data/Rakefile +6 -0
  10. data/examples/assets/fonts/fontawesome-webfont.ttf +0 -0
  11. data/examples/fizzbuzz/fizzbuzz.rb +43 -0
  12. data/examples/fizzbuzz/main.qml +38 -0
  13. data/examples/imageprovider/imageprovider.rb +57 -0
  14. data/examples/imageprovider/main.qml +51 -0
  15. data/examples/todo/main.qml +70 -0
  16. data/examples/todo/todo.rb +36 -0
  17. data/examples/twitter/main.qml +36 -0
  18. data/examples/twitter/twitter.rb +55 -0
  19. data/ext/qml/accessclass.cpp +71 -0
  20. data/ext/qml/accessclass.h +19 -0
  21. data/ext/qml/accessobject.cpp +30 -0
  22. data/ext/qml/accessobject.h +22 -0
  23. data/ext/qml/application.cpp +54 -0
  24. data/ext/qml/application.h +17 -0
  25. data/ext/qml/common.h +18 -0
  26. data/ext/qml/ext_accesssupport.cpp +77 -0
  27. data/ext/qml/ext_accesssupport.h +42 -0
  28. data/ext/qml/ext_gcmarker.cpp +39 -0
  29. data/ext/qml/ext_gcmarker.h +27 -0
  30. data/ext/qml/ext_kernel.cpp +62 -0
  31. data/ext/qml/ext_kernel.h +11 -0
  32. data/ext/qml/ext_metaobject.cpp +410 -0
  33. data/ext/qml/ext_metaobject.h +62 -0
  34. data/ext/qml/ext_pluginloader.cpp +55 -0
  35. data/ext/qml/ext_pluginloader.h +32 -0
  36. data/ext/qml/ext_pointer.cpp +134 -0
  37. data/ext/qml/ext_pointer.h +43 -0
  38. data/ext/qml/ext_testutil.cpp +42 -0
  39. data/ext/qml/ext_testutil.h +11 -0
  40. data/ext/qml/extconf.rb +84 -0
  41. data/ext/qml/foreignclass.cpp +72 -0
  42. data/ext/qml/foreignclass.h +88 -0
  43. data/ext/qml/foreignmetaobject.cpp +345 -0
  44. data/ext/qml/foreignmetaobject.h +46 -0
  45. data/ext/qml/foreignobject.cpp +22 -0
  46. data/ext/qml/foreignobject.h +21 -0
  47. data/ext/qml/functioninfo.h +16 -0
  48. data/ext/qml/init.cpp +69 -0
  49. data/ext/qml/listmodel.cpp +112 -0
  50. data/ext/qml/listmodel.h +43 -0
  51. data/ext/qml/markable.h +12 -0
  52. data/ext/qml/objectdata.cpp +26 -0
  53. data/ext/qml/objectdata.h +20 -0
  54. data/ext/qml/objectgc.cpp +69 -0
  55. data/ext/qml/objectgc.h +28 -0
  56. data/ext/qml/plugins/core/applicationextension.cpp +34 -0
  57. data/ext/qml/plugins/core/applicationextension.h +28 -0
  58. data/ext/qml/plugins/core/componentextension.cpp +41 -0
  59. data/ext/qml/plugins/core/componentextension.h +28 -0
  60. data/ext/qml/plugins/core/contextextension.cpp +39 -0
  61. data/ext/qml/plugins/core/contextextension.h +29 -0
  62. data/ext/qml/plugins/core/core.pro +29 -0
  63. data/ext/qml/plugins/core/coreplugin.cpp +87 -0
  64. data/ext/qml/plugins/core/coreplugin.h +49 -0
  65. data/ext/qml/plugins/core/engineextension.cpp +27 -0
  66. data/ext/qml/plugins/core/engineextension.h +28 -0
  67. data/ext/qml/plugins/core/imageprovider.cpp +38 -0
  68. data/ext/qml/plugins/core/imageprovider.h +18 -0
  69. data/ext/qml/plugins/core/imagerequestpromise.cpp +19 -0
  70. data/ext/qml/plugins/core/imagerequestpromise.h +21 -0
  71. data/ext/qml/plugins/core/qmlexception.cpp +11 -0
  72. data/ext/qml/plugins/core/qmlexception.h +17 -0
  73. data/ext/qml/plugins/testutil/objectlifechecker.cpp +17 -0
  74. data/ext/qml/plugins/testutil/objectlifechecker.h +24 -0
  75. data/ext/qml/plugins/testutil/ownershiptest.cpp +26 -0
  76. data/ext/qml/plugins/testutil/ownershiptest.h +30 -0
  77. data/ext/qml/plugins/testutil/testobject.cpp +6 -0
  78. data/ext/qml/plugins/testutil/testobject.h +108 -0
  79. data/ext/qml/plugins/testutil/testobjectsubclass.cpp +10 -0
  80. data/ext/qml/plugins/testutil/testobjectsubclass.h +19 -0
  81. data/ext/qml/plugins/testutil/testutil.pro +20 -0
  82. data/ext/qml/plugins/testutil/testutilplugin.cpp +47 -0
  83. data/ext/qml/plugins/testutil/testutilplugin.h +32 -0
  84. data/ext/qml/qmltyperegisterer.cpp +74 -0
  85. data/ext/qml/qmltyperegisterer.h +30 -0
  86. data/ext/qml/rubyclass.cpp +94 -0
  87. data/ext/qml/rubyclass.h +234 -0
  88. data/ext/qml/rubyvalue.cpp +690 -0
  89. data/ext/qml/rubyvalue.h +256 -0
  90. data/ext/qml/signalforwarder.cpp +66 -0
  91. data/ext/qml/signalforwarder.h +29 -0
  92. data/ext/qml/util.cpp +120 -0
  93. data/ext/qml/util.h +101 -0
  94. data/ext/qml/valuereference.cpp +50 -0
  95. data/ext/qml/valuereference.h +22 -0
  96. data/ext/qml/weakvaluereference.cpp +27 -0
  97. data/ext/qml/weakvaluereference.h +19 -0
  98. data/lib/qml.rb +41 -0
  99. data/lib/qml/access.rb +137 -0
  100. data/lib/qml/application.rb +139 -0
  101. data/lib/qml/class_builder.rb +126 -0
  102. data/lib/qml/component.rb +53 -0
  103. data/lib/qml/context.rb +71 -0
  104. data/lib/qml/data.rb +2 -0
  105. data/lib/qml/data/array_model.rb +103 -0
  106. data/lib/qml/data/error.rb +5 -0
  107. data/lib/qml/data/list_model.rb +146 -0
  108. data/lib/qml/dispatchable.rb +34 -0
  109. data/lib/qml/dispatcher.rb +61 -0
  110. data/lib/qml/engine.rb +54 -0
  111. data/lib/qml/error_converter.rb +15 -0
  112. data/lib/qml/errors.rb +26 -0
  113. data/lib/qml/geometry.rb +3 -0
  114. data/lib/qml/geometry/point.rb +5 -0
  115. data/lib/qml/geometry/rectangle.rb +5 -0
  116. data/lib/qml/geometry/size.rb +5 -0
  117. data/lib/qml/image_provider.rb +87 -0
  118. data/lib/qml/meta_object.rb +20 -0
  119. data/lib/qml/models.rb +1 -0
  120. data/lib/qml/name_helper.rb +12 -0
  121. data/lib/qml/platform.rb +15 -0
  122. data/lib/qml/plugin_loader.rb +46 -0
  123. data/lib/qml/plugins.rb +26 -0
  124. data/lib/qml/qml.rb +1 -0
  125. data/lib/qml/qt.rb +6 -0
  126. data/lib/qml/qt_classes.rb +9 -0
  127. data/lib/qml/qt_object_base.rb +108 -0
  128. data/lib/qml/reactive.rb +8 -0
  129. data/lib/qml/reactive/bindable.rb +79 -0
  130. data/lib/qml/reactive/chained_signal.rb +25 -0
  131. data/lib/qml/reactive/error.rb +5 -0
  132. data/lib/qml/reactive/object.rb +278 -0
  133. data/lib/qml/reactive/property.rb +19 -0
  134. data/lib/qml/reactive/signal.rb +116 -0
  135. data/lib/qml/reactive/signal_spy.rb +27 -0
  136. data/lib/qml/reactive/signals/map_signal.rb +21 -0
  137. data/lib/qml/reactive/signals/merge_signal.rb +21 -0
  138. data/lib/qml/reactive/signals/select_signal.rb +21 -0
  139. data/lib/qml/reactive/simple_property.rb +17 -0
  140. data/lib/qml/reactive/unbound_property.rb +42 -0
  141. data/lib/qml/reactive/unbound_signal.rb +51 -0
  142. data/lib/qml/root_path.rb +3 -0
  143. data/lib/qml/test_util.rb +1 -0
  144. data/lib/qml/test_util/object_life_checker.rb +17 -0
  145. data/lib/qml/version.rb +3 -0
  146. data/lib/qml/wrappable.rb +9 -0
  147. data/qml.gemspec +28 -0
  148. data/spec/assets/testobj.qml +5 -0
  149. data/spec/qml/.access_spec.rb.swp +0 -0
  150. data/spec/qml/access_spec.rb +162 -0
  151. data/spec/qml/application_spec.rb +43 -0
  152. data/spec/qml/component_spec.rb +44 -0
  153. data/spec/qml/context_spec.rb +43 -0
  154. data/spec/qml/conversion_spec.rb +59 -0
  155. data/spec/qml/data/array_model_spec.rb +215 -0
  156. data/spec/qml/dispatchable_spec.rb +26 -0
  157. data/spec/qml/dispatcher_spec.rb +48 -0
  158. data/spec/qml/geometry/point_spec.rb +4 -0
  159. data/spec/qml/geometry/rectangle_spec.rb +4 -0
  160. data/spec/qml/geometry/size_spec.rb +4 -0
  161. data/spec/qml/plugin_loader_spec.rb +33 -0
  162. data/spec/qml/qt_object_base_spec.rb +119 -0
  163. data/spec/qml/reactive/object_spec.rb +273 -0
  164. data/spec/qml/reactive/property_spec.rb +70 -0
  165. data/spec/qml/reactive/signal_spec.rb +191 -0
  166. data/spec/qml/reactive/signal_spy_spec.rb +26 -0
  167. data/spec/qml/test_object_spec.rb +186 -0
  168. data/spec/qml_spec.rb +7 -0
  169. data/spec/spec_helper.rb +5 -0
  170. metadata +321 -0
@@ -0,0 +1,38 @@
1
+ #include "imageprovider.h"
2
+ #include "imagerequestpromise.h"
3
+ #include <QDebug>
4
+ #include <QApplication>
5
+
6
+ namespace RubyQml {
7
+
8
+ ImageProvider::ImageProvider(QObject *rubyCallback) :
9
+ QQuickImageProvider(QQuickImageProvider::Image, QQuickImageProvider::ForceAsynchronousImageLoading),
10
+ mRubyCallback(rubyCallback)
11
+ {
12
+ rubyCallback->setParent(this);
13
+ }
14
+
15
+ QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
16
+ {
17
+ std::promise<QImage> promise;
18
+ auto future = promise.get_future();
19
+ auto promiseObj = new ImageRequestPromise(std::move(promise));
20
+ promiseObj->moveToThread(qApp->thread());
21
+
22
+ mRubyCallback->metaObject()->invokeMethod(
23
+ mRubyCallback,
24
+ "request",
25
+ Qt::QueuedConnection,
26
+ Q_ARG(QVariant, id),
27
+ Q_ARG(QVariant, QVariant::fromValue(promiseObj)));
28
+
29
+ auto image = future.get();
30
+ if (requestedSize.isValid() && image.size() != requestedSize) {
31
+ image = image.scaled(requestedSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
32
+ }
33
+
34
+ *size = image.size();
35
+ return image;
36
+ }
37
+
38
+ } // namespace RubyQml
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+ #include <QObject>
3
+ #include <QQuickImageProvider>
4
+
5
+ namespace RubyQml {
6
+
7
+ class ImageProvider : public QObject, public QQuickImageProvider
8
+ {
9
+ Q_OBJECT
10
+ public:
11
+ explicit ImageProvider(QObject *rubyImageProvider);
12
+ QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
13
+
14
+ private:
15
+ QObject *mRubyCallback = nullptr;
16
+ };
17
+
18
+ } // namespace RubyQml
@@ -0,0 +1,19 @@
1
+ #include "imagerequestpromise.h"
2
+ #include <QImage>
3
+ #include <QDebug>
4
+
5
+ namespace RubyQml {
6
+
7
+ ImageRequestPromise::ImageRequestPromise(std::promise<QImage> &&promise, QObject *parent) :
8
+ QObject(parent),
9
+ mPromise(std::move(promise))
10
+ {
11
+ }
12
+
13
+ void ImageRequestPromise::setData(const QByteArray &data)
14
+ {
15
+ auto image = QImage::fromData(data);
16
+ mPromise.set_value(image);
17
+ }
18
+
19
+ } // namespace RubyQml
@@ -0,0 +1,21 @@
1
+ #pragma once
2
+ #include <QObject>
3
+ #include <QImage>
4
+ #include <future>
5
+
6
+ namespace RubyQml {
7
+
8
+ class ImageRequestPromise : public QObject
9
+ {
10
+ Q_OBJECT
11
+ public:
12
+ explicit ImageRequestPromise(std::promise<QImage> &&promise, QObject *parent = 0);
13
+
14
+ public slots:
15
+ void setData(const QByteArray &data);
16
+
17
+ private:
18
+ std::promise<QImage> mPromise;
19
+ };
20
+
21
+ } // namespace RubyQml
@@ -0,0 +1,11 @@
1
+ #include "qmlexception.h"
2
+ #include <QString>
3
+
4
+ namespace RubyQml {
5
+
6
+ QmlException::QmlException(const QString &error) :
7
+ std::runtime_error(error.toStdString())
8
+ {
9
+ }
10
+
11
+ } // namespace RubyQml
@@ -0,0 +1,17 @@
1
+ #ifndef RUBYQML_QMLERROR_H
2
+ #define RUBYQML_QMLERROR_H
3
+
4
+ #include <stdexcept>
5
+ class QString;
6
+
7
+ namespace RubyQml {
8
+
9
+ class QmlException : public std::runtime_error
10
+ {
11
+ public:
12
+ QmlException(const QString &error);
13
+ };
14
+
15
+ } // namespace RubyQml
16
+
17
+ #endif // RUBYQML_QMLERROR_H
@@ -0,0 +1,17 @@
1
+ #include "objectlifechecker.h"
2
+ #include <QQmlEngine>
3
+
4
+ namespace RubyQml {
5
+
6
+ ObjectLifeChecker::ObjectLifeChecker(QObject *target) :
7
+ mTarget(target)
8
+ {
9
+ }
10
+
11
+ bool ObjectLifeChecker::isOwnedByQml() const
12
+ {
13
+ if (!mTarget) return false;
14
+ return QQmlEngine::objectOwnership(mTarget) == QQmlEngine::JavaScriptOwnership;
15
+ }
16
+
17
+ } // namespace RubyQml
@@ -0,0 +1,24 @@
1
+ #pragma once
2
+ #include <QObject>
3
+ #include <QPointer>
4
+
5
+ namespace RubyQml {
6
+
7
+ class ObjectLifeChecker : public QObject
8
+ {
9
+ Q_OBJECT
10
+ Q_PROPERTY(QObject* target READ target)
11
+ public:
12
+ explicit ObjectLifeChecker(QObject *target);
13
+ QObject *target() { return mTarget; }
14
+ signals:
15
+
16
+ public slots:
17
+ bool isAlive() const { return mTarget; }
18
+ bool isOwnedByQml() const;
19
+
20
+ private:
21
+ QPointer<QObject> mTarget;
22
+ };
23
+
24
+ } // namespace RubyQml
@@ -0,0 +1,26 @@
1
+ #include "ownershiptest.h"
2
+
3
+ namespace RubyQml {
4
+
5
+ OwnershipTest::OwnershipTest(QObject *parent) :
6
+ QObject(parent)
7
+ {
8
+ mSubObject = new QObject(this);
9
+ connect(mSubObject, &QObject::destroyed, this, &OwnershipTest::subObjectDeleted);
10
+ mPropertyObject = new QObject();
11
+ connect(mPropertyObject, &QObject::destroyed, this, &OwnershipTest::subObjectDeleted);
12
+ }
13
+
14
+ OwnershipTest::~OwnershipTest()
15
+ {
16
+ delete mPropertyObject;
17
+ }
18
+
19
+ QObject *OwnershipTest::createObject()
20
+ {
21
+ auto obj = new QObject();
22
+ connect(obj, &QObject::destroyed, this, &OwnershipTest::createdObjectDeleted);
23
+ return obj;
24
+ }
25
+
26
+ } // namespace RubyQml
@@ -0,0 +1,30 @@
1
+ #pragma once
2
+ #include <QObject>
3
+
4
+ namespace RubyQml {
5
+
6
+ class OwnershipTest : public QObject
7
+ {
8
+ Q_OBJECT
9
+ Q_PROPERTY(QObject* propertyObject READ propertyObject)
10
+ public:
11
+ explicit OwnershipTest(QObject *parent = 0);
12
+ ~OwnershipTest();
13
+
14
+ QObject *propertyObject() { return mPropertyObject; }
15
+
16
+ signals:
17
+ void subObjectDeleted();
18
+ void propertyObjectDeleted();
19
+ void createdObjectDeleted();
20
+
21
+ public slots:
22
+ QObject *subObject() { return mSubObject; }
23
+ QObject *createObject();
24
+
25
+ private:
26
+ QObject *mSubObject;
27
+ QObject *mPropertyObject;
28
+ };
29
+
30
+ } // namespace RubyQml
@@ -0,0 +1,6 @@
1
+ #include "testobject.h"
2
+
3
+ namespace RubyQml {
4
+
5
+ } // namespace RubyQml
6
+
@@ -0,0 +1,108 @@
1
+ #pragma once
2
+
3
+ #include <QObject>
4
+ #include <QVariant>
5
+ #include <QDebug>
6
+ #include <QtPlugin>
7
+ #include <stdexcept>
8
+
9
+ namespace RubyQml {
10
+
11
+ class TestObject : public QObject
12
+ {
13
+ Q_OBJECT
14
+ Q_PROPERTY(QString name MEMBER mName NOTIFY nameChanged)
15
+ Q_PROPERTY(double someValue MEMBER mSomeValue NOTIFY someValueChanged)
16
+ Q_PROPERTY(RubyQml::TestObject::Enums enumValue MEMBER mEnumValue NOTIFY enumValueChanged)
17
+
18
+ public:
19
+ explicit TestObject(QObject *parent = 0) : QObject(parent)
20
+ {
21
+ }
22
+
23
+ enum Enums
24
+ {
25
+ Foo = 0,
26
+ Bar = 1,
27
+ FooBar = 2,
28
+ };
29
+
30
+ public slots:
31
+
32
+ int normalMethod(int x, const QString &y)
33
+ {
34
+ return x + y.toInt();
35
+ }
36
+
37
+ QVariant variantMethod(const QVariant &x, const QVariant &y)
38
+ {
39
+ int sum = x.toInt();
40
+ auto list = y.toList();
41
+ for (const auto &variant : list) {
42
+ sum += variant.toInt();
43
+ }
44
+ return sum;
45
+ }
46
+
47
+ QString overloadedMethod(int x)
48
+ {
49
+ Q_UNUSED(x);
50
+ return "first";
51
+ }
52
+
53
+ QString overloadedMethod(const QString &x)
54
+ {
55
+ Q_UNUSED(x);
56
+ return "last";
57
+ }
58
+
59
+ QString overloadedMethod(const QString &x, int y)
60
+ {
61
+ Q_UNUSED(x)
62
+ Q_UNUSED(y)
63
+ return "2 params";
64
+ }
65
+
66
+ void emitSomeSignal(const QString &arg)
67
+ {
68
+ emit someSignal(arg);
69
+ }
70
+
71
+ QString getName() const
72
+ {
73
+ return mName;
74
+ }
75
+
76
+ void throwingMethod() const
77
+ {
78
+ throw std::runtime_error("test error");
79
+ }
80
+
81
+ const QMetaObject *metaObjectMethod() const
82
+ {
83
+ return &TestObject::staticMetaObject;
84
+ }
85
+
86
+ QObject *selfReturningMethod()
87
+ {
88
+ return this;
89
+ }
90
+
91
+ signals:
92
+
93
+ void someSignal(const QString &arg);
94
+ void nameChanged(const QString &name);
95
+ void someValueChanged(double value);
96
+ void enumValueChanged(RubyQml::TestObject::Enums value);
97
+
98
+ private:
99
+
100
+ Q_ENUMS(Enums)
101
+ QString mName;
102
+ double mSomeValue = 0;
103
+ Enums mEnumValue = Foo;
104
+ };
105
+
106
+ } // RubyQml
107
+
108
+ Q_DECLARE_METATYPE(RubyQml::TestObject::Enums)
@@ -0,0 +1,10 @@
1
+ #include "testobjectsubclass.h"
2
+
3
+ namespace RubyQml {
4
+
5
+ TestObjectSubclass::TestObjectSubclass(QObject *parent) :
6
+ TestObject(parent)
7
+ {
8
+ }
9
+
10
+ } // namespace RubyQml
@@ -0,0 +1,19 @@
1
+ #pragma once
2
+
3
+ #include "testobject.h"
4
+
5
+ namespace RubyQml {
6
+
7
+ class TestObjectSubclass : public TestObject
8
+ {
9
+ Q_OBJECT
10
+ public:
11
+ explicit TestObjectSubclass(QObject *parent = 0);
12
+
13
+ signals:
14
+
15
+ public slots:
16
+
17
+ };
18
+
19
+ } // namespace RubyQml
@@ -0,0 +1,20 @@
1
+ TEMPLATE = lib
2
+ CONFIG += plugin c++11
3
+ QT += qml
4
+
5
+ TARGET = rubyqml-testutil
6
+ INCLUDEPATH += .
7
+
8
+ # Input
9
+ SOURCES += testobject.cpp \
10
+ testobjectsubclass.cpp \
11
+ ownershiptest.cpp \
12
+ testutilplugin.cpp \
13
+ objectlifechecker.cpp
14
+
15
+ HEADERS += \
16
+ testobject.h \
17
+ testobjectsubclass.h \
18
+ ownershiptest.h \
19
+ testutilplugin.h \
20
+ objectlifechecker.h
@@ -0,0 +1,47 @@
1
+ #include "testutilplugin.h"
2
+ #include "testobject.h"
3
+ #include "testobjectsubclass.h"
4
+ #include "ownershiptest.h"
5
+ #include "objectlifechecker.h"
6
+ #include <QtQml>
7
+
8
+ Q_DECLARE_METATYPE(const QMetaObject*)
9
+
10
+ namespace RubyQml {
11
+
12
+ TestUtilPlugin::TestUtilPlugin(QObject *parent) :
13
+ QObject(parent)
14
+ {
15
+ qRegisterMetaType<TestObject *>();
16
+ qRegisterMetaType<TestObject::Enums>();
17
+ qRegisterMetaType<TestObjectSubclass *>();
18
+ qRegisterMetaType<OwnershipTest *>();
19
+ qRegisterMetaType<ObjectLifeChecker *>();
20
+
21
+ auto metaObjects = { &TestObject::staticMetaObject, &ObjectLifeChecker::staticMetaObject};
22
+ for (auto metaobj : metaObjects) {
23
+ mMetaObjects[metaobj->className()] = QVariant::fromValue(metaobj);
24
+ }
25
+ }
26
+
27
+ TestObject *TestUtilPlugin::createTestObject()
28
+ {
29
+ return new TestObject();
30
+ }
31
+
32
+ TestObjectSubclass *TestUtilPlugin::createTestObjectSubclass()
33
+ {
34
+ return new TestObjectSubclass();
35
+ }
36
+
37
+ OwnershipTest *TestUtilPlugin::createOwnershipTest()
38
+ {
39
+ return new OwnershipTest();
40
+ }
41
+
42
+ ObjectLifeChecker *TestUtilPlugin::createObjectLifeChecker(QObject *target)
43
+ {
44
+ return new ObjectLifeChecker(target);
45
+ }
46
+
47
+ } // namespace RubyQml