module dmocks.factory;

import dmocks.object_mock;
import dmocks.repository; 
import std.typecons;

package:

/** Get a mock object of the given type. */
T mock (T, CONSTRUCTOR_ARGS...) (MockRepository rep, CONSTRUCTOR_ARGS cargs) 
{
    Mocked!(T) ret = new Mocked!(T)(cargs);
    ret._owner = rep;
    return cast(T)ret;
}

MockedFinal!(T) mockFinal (T, CONSTRUCTOR_ARGS...) (MockRepository rep, CONSTRUCTOR_ARGS t) 
{
    static if (__traits(isFinalClass, T))
        T obj = new T(t);
    else
        T obj = new WhiteHole!T(t);
    MockedFinal!(T) ret = new MockedFinal!(T)(obj);
    ret._owner = rep;
    return ret;
}

MockedFinal!(T) mockFinalPassTo (T, CONSTRUCTOR_ARGS...) (MockRepository rep, T obj) 
{
    MockedFinal!(T) ret = new MockedFinal!(T)(obj);
    ret._owner = rep;
    return ret;
}

MockedStruct!(T) mockStruct (T, CONSTRUCTOR_ARGS...) (MockRepository rep, CONSTRUCTOR_ARGS t) 
{
    MockedStruct!(T) ret = MockedStruct!(T)(T(t));
    ret._owner = rep;
    return ret;
}

MockedStruct!(T) mockStructPassTo (T, CONSTRUCTOR_ARGS...) (MockRepository rep, T obj) 
{
    MockedStruct!(T) ret = MockedStruct!(T)(obj);
    ret._owner = rep;
    return ret;
}