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(cEngine);
25     Value     cls  = new Value(clst);
26 
27     engine.defineVariable(className, cls);
28 
29     return cls;
30   }
31 }
32 
33 
34 class NewOperator : IOperator {
35   public Value call(Engine engine, Value[] args) {
36     string className;
37 
38     if (args[0].type == ValueType.SymbolValue) {
39       className = args[0].getString;
40     } else {
41       className = engine.eval(args[0]).getString;
42     }
43 
44     ClassType _cls = engine.getVariable(className).getClassType;
45     ClassType cls = new ClassType(_cls._engine.clone);
46 
47     Value[] cArgs;
48 
49     if (args.length > 0) {
50       foreach (arg; args[1..$]) {
51         cArgs ~= engine.eval(arg);
52       }
53     }
54 
55     cls._engine.variables["constructor"].getIOperator.call(cls._engine, cArgs);
56 
57     return new Value(cls);
58   }
59 }