www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - inheriting ctors?

reply dcoder <dcoder devnull.com> writes:
Suppose I have a base class with many ctors().

I want to inherit from the base class and make one slight alteration to it,
but I don't want to write X times the following:

this(args) {
  super(args);
}

Does D have an easy way for the derived class to 'inherit' all or some of the
base class ctors(), and just override/add ctors() in the derived class?

In Java, we can use eclipse to auto-generate code for us.  :)  But,
the results look cluttered, and it's really not a solution.

Anyways, just curious.

thanks.
Aug 05 2010
next sibling parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Thu, 05 Aug 2010 13:53:20 -0400, dcoder <dcoder devnull.com> wrote:

 Suppose I have a base class with many ctors().

 I want to inherit from the base class and make one slight alteration to  
 it,
 but I don't want to write X times the following:

 this(args) {
   super(args);
 }

 Does D have an easy way for the derived class to 'inherit' all or some  
 of the
 base class ctors(), and just override/add ctors() in the derived class?

Sadly, no. It's been discussed in the past. I was surprised there were no enhancement requests for it in bugzilla, care to add one? You may be able to do it with templated constructors, but documentation would suck... -Steve
Aug 05 2010
parent reply Sean Kelly <sean invisibleduck.org> writes:
Steven Schveighoffer Wrote:

 On Thu, 05 Aug 2010 13:53:20 -0400, dcoder <dcoder devnull.com> wrote:
 
 Suppose I have a base class with many ctors().

 I want to inherit from the base class and make one slight alteration to  
 it,
 but I don't want to write X times the following:

 this(args) {
   super(args);
 }

 Does D have an easy way for the derived class to 'inherit' all or some  
 of the
 base class ctors(), and just override/add ctors() in the derived class?

Sadly, no. It's been discussed in the past. I was surprised there were no enhancement requests for it in bugzilla, care to add one?

If it helps, I wrote up something on this a few years back: http://www.digitalmars.com/d/archives/digitalmars/D/Inheriting_constructors_54088.html Might be a good starting point for an enhancement request.
Aug 05 2010
parent reply Rory Mcguire <rjmcguire gm_no_ail.com> writes:
Sean Kelly wrote:

 Steven Schveighoffer Wrote:
 
 On Thu, 05 Aug 2010 13:53:20 -0400, dcoder <dcoder devnull.com> wrote:
 
 Suppose I have a base class with many ctors().

 I want to inherit from the base class and make one slight alteration to
 it,
 but I don't want to write X times the following:

 this(args) {
   super(args);
 }

 Does D have an easy way for the derived class to 'inherit' all or some
 of the
 base class ctors(), and just override/add ctors() in the derived class?

Sadly, no. It's been discussed in the past. I was surprised there were no enhancement requests for it in bugzilla, care to add one?

If it helps, I wrote up something on this a few years back:

 
 Might be a good starting point for an enhancement request.

I've been trying to make a template for this but it seems that dmd still won't allow me to get the parameters of the constructors. dmd Seems to think that I'm trying to use it as a property. Using getOverloads, one should be able to generate or select any of super's constructors. No need for enhancement, just a bug fix. see below: import std.traits; import std.conv; class A { int i; this(int x) { i = x; } this(float x) { i = cast(int)x; // ignore bad code } this(string s) { i = to!int(s); } } void main() { foreach (m; __traits(getOverloads, A, "__ctor")) { pragma(msg, m.stringof); // it thinks I'm calling m } } constructors.d(34): Error: constructor constructors.A.this (int x) is not callable using argument types () constructors.d(34): Error: expected 1 function arguments, not 0 this() constructors.d(34): Error: constructor constructors.A.this (float x) is not callable using argument types () constructors.d(34): Error: expected 1 function arguments, not 0 this() constructors.d(34): Error: constructor constructors.A.this (string s) is not callable using argument types () constructors.d(34): Error: expected 1 function arguments, not 0 this()
Aug 06 2010
next sibling parent bearophile <bearophileHUGS lycos.com> writes:
Philippe Sigaud:
 This is my new once-a-day bug :(

Add them all to Bugzilla :-) Bye, bearophile
Aug 06 2010
prev sibling parent reply Rory Mcguire <rjmcguire gm_no_ail.com> writes:
Philippe Sigaud wrote:

 On Fri, Aug 6, 2010 at 11:43, Rory Mcguire <rjmcguire gm_no_ail.com>
 wrote:
 
 
 I've been trying to make a template for this but it seems that dmd still
 won't allow me to get the parameters of the constructors. dmd Seems to
 think
 that I'm trying to use it as a property.

 void main() {
    foreach (m; __traits(getOverloads, A, "__ctor")) {
        pragma(msg, m.stringof); // it thinks I'm calling m
    }
 }

 constructors.d(34): Error: constructor constructors.A.this (int x) is not
 callable using argument types ()

This is my new once-a-day bug :( Using a function alias, and being unable to call properties on it, because DMD thinks I'm calling it. Man, it's no property, just a name! Anyway, just pragma(msg, m) works, strangely. I think I found a way to use m, somewhat: void main() { foreach (m; __traits(getOverloads, A, "__ctor")) { pragma(msg, m); // it thinks I'm calling m typeof(&m) tmp = &m; writeln( (ParameterTypeTuple!tmp).stringof); // (int), (double), (string) writeln( (ParameterTypeTuple!m).stringof); // (int), (int), (int) writeln( typeof(&m).stringof); // A function(int x), A function(double x), A function(string s) } } using ParameterTypeTuple!m directly does not differentiate the m's. But using a temporary pointer, it seems to work. Oh and I even get the arguments names ! Philippe

Thanks!! works now. Now we just need to be able to select which constructors we actually want. string inheritconstructors_helper(alias T)() { string s; foreach (m; __traits(getOverloads, T, "__ctor")) { string args, args1; foreach (i, cons; ParameterTypeTuple!(typeof(&m))) { pragma(msg, cons.stringof); args ~= ","~cons.stringof~" v"~to!string(i); args1 ~= ",v"~to!string(i); } args = args.length < 1 ? args : args[1..$]; args1 = args1.length < 1 ? args1 : args1[1..$]; s ~= "this("~args~") { super("~args1~"); }\n"; } return s; } class A { int i; //private this() {} this(int x) { i = x; } this(float x) { i = cast(int)x; // ignore bad code } this(string s, int mul) { // test multiple args i = to!int(s) * mul; } } class B : A { mixin(inheritconstructors_helper!A()); // InheritConstructors!A; } void main() { A a = new B(4); a = new B("42", 2); }
Aug 06 2010
parent Rory Mcguire <rjmcguire gm_no_ail.com> writes:
Rory Mcguire wrote:

 Philippe Sigaud wrote:
 
 On Fri, Aug 6, 2010 at 11:43, Rory Mcguire <rjmcguire gm_no_ail.com>
 wrote:
 
 
 I've been trying to make a template for this but it seems that dmd still
 won't allow me to get the parameters of the constructors. dmd Seems to
 think
 that I'm trying to use it as a property.

 void main() {
    foreach (m; __traits(getOverloads, A, "__ctor")) {
        pragma(msg, m.stringof); // it thinks I'm calling m
    }
 }

 constructors.d(34): Error: constructor constructors.A.this (int x) is
 not callable using argument types ()

This is my new once-a-day bug :( Using a function alias, and being unable to call properties on it, because DMD thinks I'm calling it. Man, it's no property, just a name! Anyway, just pragma(msg, m) works, strangely. I think I found a way to use m, somewhat: void main() { foreach (m; __traits(getOverloads, A, "__ctor")) { pragma(msg, m); // it thinks I'm calling m typeof(&m) tmp = &m; writeln( (ParameterTypeTuple!tmp).stringof); // (int), (double), (string) writeln( (ParameterTypeTuple!m).stringof); // (int), (int), (int) writeln( typeof(&m).stringof); // A function(int x), A function(double x), A function(string s) } } using ParameterTypeTuple!m directly does not differentiate the m's. But using a temporary pointer, it seems to work. Oh and I even get the arguments names ! Philippe

Thanks!! works now. Now we just need to be able to select which constructors we actually want. string inheritconstructors_helper(alias T)() { string s; foreach (m; __traits(getOverloads, T, "__ctor")) { string args, args1; foreach (i, cons; ParameterTypeTuple!(typeof(&m))) { pragma(msg, cons.stringof); args ~= ","~cons.stringof~" v"~to!string(i); args1 ~= ",v"~to!string(i); } args = args.length < 1 ? args : args[1..$]; args1 = args1.length < 1 ? args1 : args1[1..$]; s ~= "this("~args~") { super("~args1~"); }\n"; } return s; } class A { int i; //private this() {} this(int x) { i = x; } this(float x) { i = cast(int)x; // ignore bad code } this(string s, int mul) { // test multiple args i = to!int(s) * mul; } } class B : A { mixin(inheritconstructors_helper!A()); // InheritConstructors!A; } void main() { A a = new B(4); a = new B("42", 2); }

Got selection working: string inheritconstructors_helper(alias T,Selectors...)() { string s; foreach (m; __traits(getOverloads, T, "__ctor")) { string args, args1; pragma(msg, typeof(&m)); /*foreach (sel; Selectors) { pragma(msg, sel, is (sel == typeof(&m))); continue top; }*/ if (staticIndexOf!(typeof(&m), Selectors)==-1) { continue; } foreach (i, cons; ParameterTypeTuple!(typeof(&m))) { pragma(msg, cons.stringof); args ~= ","~cons.stringof~" v"~to!string(i); args1 ~= ",v"~to!string(i); } args = args.length < 1 ? args : args[1..$]; args1 = args1.length < 1 ? args1 : args1[1..$]; s ~= "this("~args~") { super("~args1~"); }\n"; } return s; } Usage: class B : A { mixin(inheritconstructors_helper!(A,TypeTuple!(A function(string,int) ,A function(int)))()); }
Aug 06 2010
prev sibling next sibling parent "Simen kjaeraas" <simen.kjaras gmail.com> writes:
dcoder <dcoder devnull.com> wrote:

 Suppose I have a base class with many ctors().

 I want to inherit from the base class and make one slight alteration to  
 it,
 but I don't want to write X times the following:

 this(args) {
   super(args);
 }

 Does D have an easy way for the derived class to 'inherit' all or some  
 of the
 base class ctors(), and just override/add ctors() in the derived class?

No easy way, no. The best solution might be template or string mixins. -- Simen
Aug 05 2010
prev sibling next sibling parent Philippe Sigaud <philippe.sigaud gmail.com> writes:
--002215401c12e5d76b048d2a5b46
Content-Type: text/plain; charset=ISO-8859-1

On Fri, Aug 6, 2010 at 11:43, Rory Mcguire <rjmcguire gm_no_ail.com> wrote:


 I've been trying to make a template for this but it seems that dmd still
 won't allow me to get the parameters of the constructors. dmd Seems to
 think
 that I'm trying to use it as a property.

 void main() {
    foreach (m; __traits(getOverloads, A, "__ctor")) {
        pragma(msg, m.stringof); // it thinks I'm calling m
    }
 }

 constructors.d(34): Error: constructor constructors.A.this (int x) is not
 callable using argument types ()

This is my new once-a-day bug :( Using a function alias, and being unable to call properties on it, because DMD thinks I'm calling it. Man, it's no property, just a name! Anyway, just pragma(msg, m) works, strangely. I think I found a way to use m, somewhat: void main() { foreach (m; __traits(getOverloads, A, "__ctor")) { pragma(msg, m); // it thinks I'm calling m typeof(&m) tmp = &m; writeln( (ParameterTypeTuple!tmp).stringof); // (int), (double), (string) writeln( (ParameterTypeTuple!m).stringof); // (int), (int), (int) writeln( typeof(&m).stringof); // A function(int x), A function(double x), A function(string s) } } using ParameterTypeTuple!m directly does not differentiate the m's. But using a temporary pointer, it seems to work. Oh and I even get the arguments names ! Philippe --002215401c12e5d76b048d2a5b46 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <div class=3D"gmail_quote">On Fri, Aug 6, 2010 at 11:43, Rory Mcguire <span= dir=3D"ltr">&lt;<a href=3D"mailto:rjmcguire gm_no_ail.com">rjmcguire gm_no= _ail.com</a>&gt;</span> wrote:<br><div>=A0</div><blockquote class=3D"gmail_= quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, = 204, 204); padding-left: 1ex;"> <div>I&#39;ve been trying to make a template for this but it seems that dmd= still<br></div> won&#39;t allow me to get the parameters of the constructors. dmd Seems to = think<br> that I&#39;m trying to use it as a property.<br> <br> </blockquote><div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margi= n: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-le= ft: 1ex;">void main() {<br> =A0 =A0foreach (m; __traits(getOverloads, A, &quot;__ctor&quot;)) {<br> =A0 =A0 =A0 =A0pragma(msg, m.stringof); // it thinks I&#39;m calling m<br> =A0 =A0}<br> }<br> <br> constructors.d(34): Error: constructor constructors.A.this (int x) is not<b= r> callable using argument types ()<br></blockquote><div><br>This is my new on= ce-a-day bug :( <br>Using a function alias, and being unable to call proper= ties on it, because DMD thinks I&#39;m calling it. Man, it&#39;s no propert= y, just a name!<br> <br>Anyway, just pragma(msg, m) works, strangely.<br>I think I found a way = to use m, somewhat:<br><br>void main() {<br>=A0=A0 foreach (m; __traits(get= Overloads, A, &quot;__ctor&quot;)) {<br>=A0=A0=A0=A0=A0=A0 pragma(msg, m); = // it thinks I&#39;m calling m<br> =A0=A0=A0=A0=A0=A0 typeof(&amp;m) tmp =3D &amp;m;<br>=A0=A0=A0=A0=A0=A0=A0 = writeln( (ParameterTypeTuple!tmp).stringof); // (int), (double), (string)<b= r>=A0 =A0 =A0 =A0 writeln( (ParameterTypeTuple!m).stringof); // (int), (int= ), (int)<br>=A0=A0=A0=A0=A0=A0=A0 writeln( typeof(&amp;m).stringof); // A f= unction(int x), A function(double x), A function(string s)<br> =A0=A0 }<br>}<br><br>using ParameterTypeTuple!m directly does not different= iate the m&#39;s. But using a temporary pointer, it seems to work.<br><br>O= h and I even get the arguments names !<br><br><br>Philippe<br><br></div></d= iv> --002215401c12e5d76b048d2a5b46--
Aug 06 2010
prev sibling next sibling parent Philippe Sigaud <philippe.sigaud gmail.com> writes:
--00032555b95ab81de9048d2b152c
Content-Type: text/plain; charset=ISO-8859-1

On Fri, Aug 6, 2010 at 19:09, bearophile <bearophileHUGS lycos.com> wrote:

 Philippe Sigaud:
 This is my new once-a-day bug :(

Add them all to Bugzilla :-)

I do, from time to time. But I'm never sure if it's a bug or not. It's related to The Great And Neverending Property Debate (tm). So I don't what to believe. Philippe --00032555b95ab81de9048d2b152c Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <div class=3D"gmail_quote">On Fri, Aug 6, 2010 at 19:09, bearophile <span d= ir=3D"ltr">&lt;<a href=3D"mailto:bearophileHUGS lycos.com">bearophileHUGS l= ycos.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style= =3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); p= adding-left: 1ex;"> Philippe Sigaud:<br> <div class=3D"im">&gt; This is my new once-a-day bug :(<br> <br> </div>Add them all to Bugzilla :-)<br></blockquote><div><br>I do, from time= to time. But I&#39;m never sure if it&#39;s a bug or not.<br><br>It&#39;s = related to The Great And Neverending Property Debate (tm). So I don&#39;t w= hat to believe.<br> <br><br>Philippe<br><br></div></div> --00032555b95ab81de9048d2b152c--
Aug 06 2010
prev sibling next sibling parent reply Rory Mcguire <rjmcguire gm_no_ail.com> writes:
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7Bit

dcoder wrote:

 Suppose I have a base class with many ctors().
 
 I want to inherit from the base class and make one slight alteration to
 it, but I don't want to write X times the following:
 
 this(args) {
   super(args);
 }
 
 Does D have an easy way for the derived class to 'inherit' all or some of
 the base class ctors(), and just override/add ctors() in the derived
 class?
 
 In Java, we can use eclipse to auto-generate code for us.  :)  But,
 the results look cluttered, and it's really not a solution.
 
 Anyways, just curious.
 
 thanks.

Here is a possible solution to your problem: -Rory
Aug 06 2010
parent Rory Mcguire <rjmcguire gm_no_ail.com> writes:
Philippe Sigaud wrote:

 On Fri, Aug 6, 2010 at 21:59, Rory Mcguire <rjmcguire gm_no_ail.com>
 wrote:
 
 Here is a possible solution to your problem:

 -Rory

I believe you can get the type of A. Isn't it typeof(super) or std.traits.BaseClassesTuple!B[0] ? B in the latter case being typeof(this) That way, there is no need for the user to provide A, it's automatically found by the template. Warning: I did not test this. And, we know the constructs are of type 'A function(someTypes)' [*], so the 'A function' part is redundant. Hence, the user only needs to provide for the args types and that makes for a cleaner call. * either as a list : mixin(InheritConstructors!(int, double, string)); // I want to inherit the constructors taking one type, build me the __ctors for int, double and string * or, in the case of multi-parameters constructors, wrap them in a tuple: mixin(InheritConstructors!(int, double, Tuple!(int, double)); // I want super(int), super(double) and super(int, double) That means iterating on the type list, and determining if the current type is a tuple or not * if its a 'normal' type, create the corresponding contructor * if it's a Tuple, crack it open and get the types, using the .Types alias std.typecons.Tuples have. Creating a constructor from this typetuple is no different from creating it for one type. To determine if something is a std.typecons.Tuple, you cannot use an is() expression: they do not allow multiple types: enum bool isTuple = is(T == Tuple!U, U...); // no. U... is not allowed. Hmm, enhancement request? So, you can either rely on it having a .Types 'member': template isTuple(T) { enum bool isTuple = is(T.Types); } Pb: that will flag as tuples any type that exposes a ".Types" alias. Or use a function accepting a Tuple: template isTuple(T) { enum bool isTuple = is(typeof({ void foo(U...)(Tuple!U t) {}; // this function accepts only tuples foo(T.init); // test it }())); } It's ugly as a rat's ass, but it's more solid than the former template. Philippe [*] btw, shouldn't that be A delegate(someTypes)???

I'll see what I can do to shorten it but I'm not sure how to iterate over the Selectors inside the foreach and still be able to skip unselected constructors. Hmmm I suppose I could use a temporary boolean or something. I don't use "A delegate(someTuypes)" because the compiler says that the type of the constructors is for instance: "A function(int x)"
Aug 09 2010
prev sibling parent Philippe Sigaud <philippe.sigaud gmail.com> writes:
--00032555a3da85c6fe048d2de06c
Content-Type: text/plain; charset=ISO-8859-1

On Fri, Aug 6, 2010 at 21:59, Rory Mcguire <rjmcguire gm_no_ail.com> wrote:

 Here is a possible solution to your problem:

 -Rory

I believe you can get the type of A. Isn't it typeof(super) or std.traits.BaseClassesTuple!B[0] ? B in the latter case being typeof(this) That way, there is no need for the user to provide A, it's automatically found by the template. Warning: I did not test this. And, we know the constructs are of type 'A function(someTypes)' [*], so the 'A function' part is redundant. Hence, the user only needs to provide for the args types and that makes for a cleaner call. * either as a list : mixin(InheritConstructors!(int, double, string)); // I want to inherit the constructors taking one type, build me the __ctors for int, double and string * or, in the case of multi-parameters constructors, wrap them in a tuple: mixin(InheritConstructors!(int, double, Tuple!(int, double)); // I want super(int), super(double) and super(int, double) That means iterating on the type list, and determining if the current type is a tuple or not * if its a 'normal' type, create the corresponding contructor * if it's a Tuple, crack it open and get the types, using the .Types alias std.typecons.Tuples have. Creating a constructor from this typetuple is no different from creating it for one type. To determine if something is a std.typecons.Tuple, you cannot use an is() expression: they do not allow multiple types: enum bool isTuple = is(T == Tuple!U, U...); // no. U... is not allowed. Hmm, enhancement request? So, you can either rely on it having a .Types 'member': template isTuple(T) { enum bool isTuple = is(T.Types); } Pb: that will flag as tuples any type that exposes a ".Types" alias. Or use a function accepting a Tuple: template isTuple(T) { enum bool isTuple = is(typeof({ void foo(U...)(Tuple!U t) {}; // this function accepts only tuples foo(T.init); // test it }())); } It's ugly as a rat's ass, but it's more solid than the former template. Philippe [*] btw, shouldn't that be A delegate(someTypes)??? --00032555a3da85c6fe048d2de06c Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <div class=3D"gmail_quote">On Fri, Aug 6, 2010 at 21:59, Rory Mcguire <span= dir=3D"ltr">&lt;<a href=3D"mailto:rjmcguire gm_no_ail.com">rjmcguire gm_no= _ail.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style= =3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); p= adding-left: 1ex;"> <div><div></div><div class=3D"h5"> <br> </div></div>Here is a possible solution to your problem:<br> <font color=3D"#888888"><br> -Rory</font></blockquote><div><br>I believe you can get the type of A. Isn&= #39;t it typeof(super) or std.traits.BaseClassesTuple!B[0] ? B in the latte= r case being typeof(this)<br>That way, there is no need for the user to pro= vide A, it&#39;s automatically found by the template.<br> Warning: I did not test this.<br><br>And, we know the constructs are of typ= e &#39;A function(someTypes)&#39;=A0 [*], so the &#39;A function&#39; part = is redundant.<br>Hence, the user only needs to provide for the args types a= nd that makes for a cleaner call.<br> <br>* either as a list : <br>=A0=A0=A0 mixin(InheritConstructors!(int, doub= le, string)); // I want to inherit the constructors taking one type, build = me the __ctors for int, double and string<br><br>* or, in the case of multi= -parameters constructors, wrap them in a tuple:<br> =A0=A0=A0 mixin(InheritConstructors!(int, double, Tuple!(int, double)); // = I want super(int), super(double) and super(int, double)<br><br>That means i= terating on the type list, and determining if the current type is a tuple o= r not<br> * if its a &#39;normal&#39; type, create the corresponding contructor<br>* = if it&#39;s a Tuple, crack it open and get the types, using the .Types alia= s std.typecons.Tuples have. Creating a constructor from this typetuple is n= o different from creating it for one type.<br> <br>To determine if something is a std.typecons.Tuple, you cannot use an is= () expression: they do not allow multiple types:<br><br>enum bool isTuple = =3D is(T =3D=3D Tuple!U, U...); // no. U... is not allowed. Hmm, enhancemen= t request?<br> <br>So, you can either rely on it having a .Types &#39;member&#39;:<br><br>= template isTuple(T)<br>{<br>=A0 enum bool isTuple =3D is(T.Types);<br>}<br>= <br>Pb: that will flag as tuples any type that exposes a &quot;.Types&quot;= alias.<br> <br>Or use a function accepting a Tuple:<br><br>template isTuple(T)<br>{<br=
=A0=A0=A0 enum bool isTuple =3D is(typeof({<br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=

void foo(U...)(Tuple!U t) {}; // this function accepts only tuples<br>=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 foo(T.init); // test it<br> =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 }()));<br>}<br><br>It&#39;s ugly as a rat&#39;s as= s, but it&#39;s more solid than the former template.<br><br><br>Philippe<br=
<br>[*] btw, shouldn&#39;t that be A delegate(someTypes)??? <br>

--00032555a3da85c6fe048d2de06c--
Aug 06 2010