1 module orelang.operator.ClassOperators;
2 import orelang.operator.DynamicOperator,
3        orelang.expression.ClassType,
4        orelang.operator.IOperator,
5        orelang.Closure,
6        orelang.Engine,
7        orelang.Value;
8 
9 class ClassOperator : IOperator {
10   public Value call(Engine engine, Value[] args) {
11     string className = engine.eval(args[0]).getString;
12     Engine cEngine   = engine.clone;
13 
14     if (args.length > 1) {
15       foreach (member; args[1..$]) {
16         cEngine.eval(member);
17       }
18     }
19 
20     if ("constructor" !in cEngine.variables.called) {
21       cEngine.defineVariable("constructor", new Value(cast(IOperator)(new DynamicOperator((string[]).init, new Value)))); 
22     }
23 
24     ClassType clst = new ClassType(className, cEngine);
25     Value     cls  = new Value(clst);
26     engine.defineVariable(className, cls);
27 
28     return cls;
29   }
30 }
31 
32 
33 class NewOperator : IOperator {
34   public Value call(Engine engine, Value[] args) {
35     string className;
36     if (args[0].type == ValueType.SymbolValue) {
37       className = args[0].getString;
38     } else {
39       className = engine.eval(args[0]).getString;
40     }
41 
42     ClassType _cls = engine.getVariable(className).getClassType;
43     ClassType cls = new ClassType(_cls.className, _cls._engine.clone);
44 
45     Value[] cArgs;
46 
47     if (args.length > 0) {
48       foreach (arg; args[1..$]) {
49         cArgs ~= engine.eval(arg);
50       }
51     }
52 
53     cls._engine.variables["constructor"].getIOperator.call(cls._engine, cArgs);
54 
55     return new Value(cls);
56   }
57 }