00001
00002
00003 namespace dynamic
00004 {
00005 DYNAMIC_API var create_closure(const var & object, const char * method, const var & fn);
00006
00007 namespace internal
00008 {
00009 template<typename T> class var_member;
00010
00012
00013 template<typename T>
00014 class var_member_base : public var_methods<var_member<T>, var>
00015 {
00016 protected:
00017 var m_object;
00018 T m_member;
00019
00020 public:
00021 var_member_base(const var & object, const T & member) :
00022 m_object(object),
00023 m_member(member)
00024 {
00025 }
00026
00028 var get_var() const
00029 {
00030 return m_object.impl().get_member(m_member);
00031 }
00032
00034 var deref() const { return get_var(); }
00035
00037 void set(const var & v)
00038 {
00039 m_object.impl().set_member(m_member, v);
00040 }
00041
00042 var_member<const char*> operator[](const char * m) const;
00043 var_member<int> operator[](int m) const;
00044 var_member<var> operator[](const var & m) const;
00045
00046 template<typename U>
00047 var_member<var> operator[](const var_member_base<U>&m) const;
00048 };
00049
00050
00052
00057 template<typename T>
00058 class var_member : public var_member_base<T>
00059 {
00060 public:
00061 var_member(const var & object, const T & member) :
00062 var_member_base<T>(object, member)
00063 {
00064 }
00065
00066 var_member & operator=(const var_member & v)
00067 { set(v); return *this; }
00068
00069 template<typename U>
00070 var_member & operator=(const U & v)
00071 { set(v); return *this; }
00072 };
00073
00074
00076
00084 template<>
00085 class var_member<const char*> : public var_member_base<const char*>
00086 {
00087 public:
00088 var_member(const var & object, const char * member) :
00089 var_member_base<const char*>(object, member)
00090 {
00091 }
00092
00093 var_member & operator=(const var_member & v)
00094 { set(v); return *this; }
00095
00096 template<typename U>
00097 var_member & operator=(const U & v)
00098 { set(v); return *this; }
00099
00100 var operator++() { return m_object.impl().member_inc(m_member); }
00101 var operator--() { return m_object.impl().member_dec(m_member); }
00102 var operator++(int i) { return m_object.impl().member_inc(m_member, i); }
00103 var operator--(int i) { return m_object.impl().member_dec(m_member, i); }
00104
00105 var operator+=(const var &v) { return m_object.impl().member_add(m_member,v); }
00106 var operator-=(const var &v) { return m_object.impl().member_sub(m_member,v); }
00107
00108 var operator()() { return m_object.impl().member_call(m_member); }
00109
00110 var operator()(const var & a0)
00111 { return m_object.impl().member_call(m_member,a0); }
00112
00113 var operator()(const var & a0, const var & a1)
00114 { return m_object.impl().member_call(m_member,a0,a1); }
00115
00116 var operator()(const var & a0, const var & a1, const var & a2)
00117 { return m_object.impl().member_call(m_member,a0,a1,a2); }
00118
00119 var operator()(const var & a0, const var & a1, const var & a2, const var & a3)
00120 { return m_object.impl().member_call(m_member,a0,a1,a2,a3); }
00121
00122 var operator()(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4)
00123 { return m_object.impl().member_call(m_member,a0,a1,a2,a3,a4); }
00124
00125 var operator()(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5)
00126 { return m_object.impl().member_call(m_member,a0,a1,a2,a3,a4,a5); }
00127
00128 var operator()(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6)
00129 { return m_object.impl().member_call(m_member,a0,a1,a2,a3,a4,a5,a6); }
00130
00131 var operator()(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7)
00132 { return m_object.impl().member_call(m_member,a0,a1,a2,a3,a4,a5,a6,a7); }
00133
00134 var operator()(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8)
00135 { return m_object.impl().member_call(m_member,a0,a1,a2,a3,a4,a5,a6,a7,a8); }
00136
00137 var operator()(const var & a0, const var & a1, const var & a2, const var & a3, const var & a4, const var & a5, const var & a6, const var & a7, const var & a8, const var & a9)
00138 { return m_object.impl().member_call(m_member,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9); }
00139
00140 var_member & operator=(f1 fn)
00141 { set(create_closure(m_object, m_member, fn)); return *this; }
00142
00143 var_member & operator=(f2 fn)
00144 { set(create_closure(m_object, m_member, fn)); return *this; }
00145
00146 var_member & operator=(f3 fn)
00147 { set(create_closure(m_object, m_member, fn)); return *this; }
00148
00149 var_member & operator=(f4 fn)
00150 { set(create_closure(m_object, m_member, fn)); return *this; }
00151
00152 var_member & operator=(f5 fn)
00153 { set(create_closure(m_object, m_member, fn)); return *this; }
00154
00155 var_member & operator=(f6 fn)
00156 { set(create_closure(m_object, m_member, fn)); return *this; }
00157
00158 var_member & operator=(f7 fn)
00159 { set(create_closure(m_object, m_member, fn)); return *this; }
00160
00161 var_member & operator=(f8 fn)
00162 { set(create_closure(m_object, m_member, fn)); return *this; }
00163
00164 var_member & operator=(f9 fn)
00165 { set(create_closure(m_object, m_member, fn)); return *this; }
00166
00167 var_member & operator=(f10 fn)
00168 { set(create_closure(m_object, m_member, fn)); return *this; }
00169
00170 var_member & operator=(vf1 fn)
00171 { set(create_closure(m_object, m_member, fn)); return *this; }
00172
00173 var_member & operator=(vf2 fn)
00174 { set(create_closure(m_object, m_member, fn)); return *this; }
00175
00176 var_member & operator=(vf3 fn)
00177 { set(create_closure(m_object, m_member, fn)); return *this; }
00178
00179 var_member & operator=(vf4 fn)
00180 { set(create_closure(m_object, m_member, fn)); return *this; }
00181
00182 var_member & operator=(vf5 fn)
00183 { set(create_closure(m_object, m_member, fn)); return *this; }
00184
00185 var_member & operator=(vf6 fn)
00186 { set(create_closure(m_object, m_member, fn)); return *this; }
00187
00188 var_member & operator=(vf7 fn)
00189 { set(create_closure(m_object, m_member, fn)); return *this; }
00190
00191 var_member & operator=(vf8 fn)
00192 { set(create_closure(m_object, m_member, fn)); return *this; }
00193
00194 var_member & operator=(vf9 fn)
00195 { set(create_closure(m_object, m_member, fn)); return *this; }
00196
00197 var_member & operator=(vf10 fn)
00198 { set(create_closure(m_object, m_member, fn)); return *this; }
00199 };
00200 }
00201 }