1 /** 2 * Copyright © DiamondMVC 2018 3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE) 4 * Author: Jacob Jensen (bausshf) 5 */ 6 module diamond.data.mapping.model; 7 8 /// Base-interface for a model. 9 interface IModel { } 10 11 /// Wrapper for a base model. 12 abstract class Model : IModel 13 { 14 private: 15 /// The reader. 16 void delegate() _reader; 17 /// The inserter. 18 void delegate() _inserter; 19 /// The updater. 20 void delegate() _updater; 21 /// The deleter. 22 void delegate() _deleter; 23 24 public: 25 final: 26 /// Creates a new model. 27 this 28 ( 29 void delegate() reader, 30 void delegate() inserter, 31 void delegate() updater, 32 void delegate() deleter 33 ) 34 { 35 _reader = reader; 36 _inserter = inserter; 37 _updater = updater; 38 _deleter = deleter; 39 } 40 41 /// Reads the model from the reader. Called internally from readSingle & readMany 42 void readModel() @system 43 { 44 if (_reader) 45 { 46 _reader(); 47 } 48 } 49 50 /// Inserts the model. 51 void insertModel() @system 52 { 53 if (_inserter) 54 { 55 _inserter(); 56 } 57 } 58 59 /// Updates the model. 60 void updateModel() @system 61 { 62 if (_updater) 63 { 64 _updater(); 65 } 66 } 67 68 /// Deletes the model. 69 void deleteModel() @system 70 { 71 if (_deleter) 72 { 73 _deleter(); 74 } 75 } 76 } 77 78 // TODO: Optimize these to do CTFE: 79 80 /** 81 * Inserts an array of models. 82 * Params: 83 * models = The models to insert. 84 */ 85 void insertMany(T : IModel)(T[] models) @system 86 { 87 foreach (model; models) 88 { 89 model.insertModel(); 90 } 91 } 92 93 /** 94 * Updates an array of models. 95 * Params: 96 * models = The models to update. 97 */ 98 void updateMany(T : IModel)(T[] models) @system 99 { 100 foreach (model; models) 101 { 102 model.updateModel(); 103 } 104 } 105 106 /** 107 * Deletes an array of models. 108 * Params: 109 * models = The models to delete. 110 */ 111 void deleteMany(T : IModel)(T[] models) @system 112 { 113 foreach (model; models) 114 { 115 model.deleteModel(); 116 } 117 }