Tools for building a dynamic derived type? I need a push in the right direction.

Gary Willoughby dev at nomad.so
Sat Sep 7 10:22:26 PDT 2013


On Wednesday, 21 August 2013 at 03:37:46 UTC, Kapps wrote:
> On Tuesday, 20 August 2013 at 18:55:44 UTC, Gary Willoughby 
> wrote:
>> I've been researching ways to accomplish creating a template 
>> that creates a special kind of derived type and i think i need 
>> a push in the right direction. Take this simple class:
>>
>> class Person
>> {
>> 	private string _name;
>> 	private int _age;
>>
>> 	this(string name, int age)
>> 	{
>> 		this._name = name;
>> 		this._age  = age;
>> 	}
>>
>> 	public string getName()
>> 	{
>> 		return this._name;
>> 	}
>>
>> 	public int getAge()
>> 	{
>> 		return this._age;
>> 	}
>> }
>>
>> I want to create a mock of this class which would mean 
>> achieving the following:
>>
>> 1). Extend the class
>> 2). Override all public methods to do nothing (or look for 
>> enabled methods)
>> 3). Provide a way of dynamically enabling methods with new 
>> return values
>>
>> Extending the class is pretty easy and adding methods 
>> dynamically looks to be solved (TDPL 12.11.1) but it's the 
>> override all public methods to do something different which is 
>> beating me. I know it will probably involve mixins and dealing 
>> with tuples somewhere along the line but documentation is 
>> lacking everywhere i look.
>>
>> std.traits gives me information about a type but using that 
>> information is where i need the documentation. e.g. i know the 
>> traits methods return tuples but how do you work with these 
>> tuples? how to Iterate through them? I seem to always get 
>> stuck when trying to iterate through tuples and generate 
>> compiler errors.
>>
>> I've taken a look at the std.typecons source especially 
>> BlackHole and WhiteHole templates but i get lost. They are 
>> almost doing what i want but for abstract methods.
>>
>> The general usage is probably going to be something like this:
>>
>> class Mock(T) : T
>> {
>>    // Implementation
>> }
>>
>> auto cat = Mock!Cat("Ginger"); // constructors supported.
>>
>> auto person = Mock!Person();
>>
>> person.addMethod("getName", delegate(){
>>    return "Foo";
>> });
>>
>> person.addMethod("getAge", delegate(){
>>    return 10;
>> });
>>
>> Any help will be greatly appreciated.
>
> AutoImplement 
> (http://dlang.org/phobos/std_typecons.html#.AutoImplement) from 
> std.typecons should do what you want. Instead of implementing 
> only abstract methods, you could make it implement all 
> non-final methods by changing the 'what' template parameter to 
> simply return true (final methods are skipped regardless). Then 
> you could change the 'how' template parameter to return 
> ReturnType!parent.init unless an argument is set in an AA. I 
> can't say I've ever tried this though, so I'm not sure how well 
> it would work in reality.
>
> https://github.com/QAston/DMocks-revived may interest you as 
> well.

Thanks that gave me a lot to work with! :)


More information about the Digitalmars-d-learn mailing list