1 module uim.core.mixins.property;
2 
3 auto PROPERTYPREFIX(string dataType, string propertyName, string defaultValue = null) {
4 	return "
5 protected "~dataType~" _"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
6 protected "~dataType~" _default"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
7 
8 auto "~propertyName~"Default() { return _default"~propertyName~"; }
9 void "~propertyName~"Reset() { _"~propertyName~" = _default"~propertyName~"; }
10 void "~propertyName~"Default("~dataType~" value) { _default"~propertyName~" = value; }
11 bool "~propertyName~"IsDefault() { return (_"~propertyName~" == _default"~propertyName~"); }";
12 }
13 
14 template OProperty_get(string dataType, string propertyName, string defaultValue = null) {
15 	const char[] OProperty_get = PROPERTYPREFIX(dataType, propertyName, defaultValue) ~"
16 @property "~dataType~" "~propertyName~"() { return _"~propertyName~"; }";
17 }
18 
19 template OProperty_set(string dataType, string propertyName, string defaultValue = null) {
20 	const char[] OProperty_set = PROPERTYPREFIX(dataType, propertyName, defaultValue) ~"
21 @property O "~propertyName~"(this O)("~dataType~" value) { _"~propertyName~" = value; return cast(O)this; }";
22 }
23 
24 template OProperty(string dataType, string propertyName, string defaultValue = null, string get = null, string set = null) {
25 	const char[] getFkt = (get.length > 0) ? get : "return _"~propertyName~";";
26 	const char[] setFkt = (set.length > 0) ? set : "_"~propertyName~" = newValue; return cast(O)this;";
27 	
28 	const char[] OProperty = "
29 	protected "~dataType~" _"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
30 	protected "~dataType~" _default"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
31 	
32 	auto "~propertyName~"Default() { return _default"~propertyName~"; }
33 	O "~propertyName~"Reset(this O)() { _"~propertyName~" = _default"~propertyName~"; }
34 	O "~propertyName~"Default(this O)("~dataType~" v) { _default"~propertyName~" = v; }
35 	bool "~propertyName~"IsDefault() { return (_"~propertyName~" == _default"~propertyName~"); }
36 
37 		@property "~dataType~" "~propertyName~"() { "~getFkt~" }
38 		@property O "~propertyName~"(this O)("~dataType~" newValue) { "~setFkt~" }";
39 }
40 
41 // mixins for Template based properties
42 
43 template TProperty(string dataType, string propertyName, string defaultValue = null, string get = null, string set = null) {
44 	const char[] getFkt = (get.length > 0) ? get : "return _"~propertyName~";";
45 	const char[] setFkt = (set.length > 0) ? set : "_"~propertyName~" = newValue;";
46 	
47 	const char[] TProperty = "
48 	protected "~dataType~" _"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
49 	protected "~dataType~" _default"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
50 	
51 //	O "~propertyName~"Reset(this O)() { _"~propertyName~" = _default"~propertyName~"; return cast(O)this;}
52 //	auto "~propertyName~"Default() { return _default"~propertyName~"; }
53 //	O "~propertyName~"Default(this O)("~dataType~" newValue) { _default"~propertyName~" = newValue; return cast(O)this; }
54 //	bool "~propertyName~"IsDefault() { return (this._"~propertyName~" == _default"~propertyName~"); }
55 
56 	@property "~dataType~" "~propertyName~"(this O)() { "~getFkt~" }
57 	@property O "~propertyName~"(this O)("~dataType~" newValue) { "~setFkt~" return cast(O)this; }";
58 }
59 
60 template TPropertyAA(string keyDataType, string valueDataType, string propertyName, string defaultValue = null, string get = null, string set = null) {
61 	const char[] getFkt = (get.length > 0) ? get : "return _"~propertyName~";";
62 	const char[] setFkt = (set.length > 0) ? set : "_"~propertyName~" = newValue;";
63 	const char[] aaDataType = valueDataType~"["~keyDataType~"]";
64 	
65 	const char[] TPropertyAA = "
66 	protected "~aaDataType~" _"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
67 	protected "~aaDataType~" _default"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
68 	
69 	O "~propertyName~"Reset(this O)() { _"~propertyName~" = _default"~propertyName~"; return cast(O)this;}
70 	auto "~propertyName~"Default() { return _default"~propertyName~"; }
71 	O "~propertyName~"Default(this O)("~aaDataType~" newValue) { _default"~propertyName~" = newValue; return cast(O)this; }
72 	bool "~propertyName~"IsDefault() { return (this._"~propertyName~" == _default"~propertyName~"); }
73 
74 	@property "~aaDataType~" "~propertyName~"(this O)() { "~getFkt~" }
75 	@property O "~propertyName~"(this O)("~aaDataType~" newValue) { "~setFkt~" return cast(O)this; }
76 	O "~propertyName~"(this O)("~keyDataType~" key, "~valueDataType~" value) { _"~propertyName~"[key] = value; return cast(O)this; }
77 	O "~propertyName~"Add(this O)("~aaDataType~" values) { foreach(k,v;values) _"~propertyName~"[k] = v; return cast(O)this; }";
78 }
79 
80 // mixins for Extended Template based properties
81 
82 template TXProperty_get(string dataType, string propertyName, string defaultValue = null, string get = null) {
83 	const char[] getFkt = (get.length > 0) ? get : "return _"~propertyName~";";
84 
85 	const char[] TXProperty_get = "
86 	protected "~dataType~" _"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
87 	protected "~dataType~" _default"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
88 	
89 	O "~propertyName~"Reset(this O)() { _"~propertyName~" = _default"~propertyName~"; return cast(O)this;}
90 	auto "~propertyName~"Default() { return _default"~propertyName~"; }
91 	O "~propertyName~"Default(this O)("~dataType~" newValue) { _default"~propertyName~" = newValue; return cast(O)this; }
92 	bool "~propertyName~"IsDefault() { return (this._"~propertyName~" == _default"~propertyName~"); }
93 
94 	@property "~dataType~" "~propertyName~"(this O)() { "~getFkt~" }";
95 }
96 
97 template TXProperty(string dataType, string propertyName, string defaultValue = null, string get = null, string set = null) {
98 	const char[] getFkt = (get.length > 0) ? get : "return _"~propertyName~";";
99 	const char[] setFkt = (set.length > 0) ? set : "_"~propertyName~" ~= newValue;";
100 	
101 	const char[] TXProperty = "
102 	protected "~dataType~" _"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
103 	protected "~dataType~" _default"~propertyName~(defaultValue.length > 0 ? " = "~defaultValue : "")~";
104 	
105 	O "~propertyName~"Reset(this O)() { _"~propertyName~" = _default"~propertyName~"; return cast(O)this;}
106 	auto "~propertyName~"Default() { return _default"~propertyName~"; }
107 	O "~propertyName~"Default(this O)("~dataType~" newValue) { _default"~propertyName~" = newValue; return cast(O)this; }
108 	bool "~propertyName~"IsDefault() { return (this._"~propertyName~" == _default"~propertyName~"); }
109 
110 	@property "~dataType~" "~propertyName~"(this O)() { "~getFkt~" }
111 	@property O "~propertyName~"(this O)("~dataType~" newValue) { "~setFkt~" return cast(O)this; }";
112 }
113 
114 unittest {
115 
116 }