1 /** 2 3 License: 4 Boost Software License - Version 1.0 - August 17th, 2003 5 6 Permission is hereby granted, free of charge, to any person or organization 7 obtaining a copy of the software and accompanying documentation covered by 8 this license (the "Software") to use, reproduce, display, distribute, 9 execute, and transmit the Software, and to prepare derivative works of the 10 Software, and to permit third-parties to whom the Software is furnished to 11 do so, all subject to the following: 12 13 The copyright notices in the Software and this entire statement, including 14 the above license grant, this restriction and the following disclaimer, 15 must be included in all copies of the Software, in whole or in part, and 16 all derivative works of the Software, unless such copies or derivative 17 works are solely in the form of machine-executable object code generated by 18 a source language processor. 19 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 23 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 24 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 25 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 DEALINGS IN THE SOFTWARE. 27 28 Authors: 29 Alexandru Ermicioi 30 **/ 31 module aermicioi.aedi.storage.locator_aware; 32 33 import aermicioi.aedi.storage.locator; 34 35 /** 36 Interface for objects that are aware about an locator, and accept one of them. 37 **/ 38 interface LocatorAware(Type = Object, KeyType = string) { 39 40 public { 41 42 /** 43 Set a locator to object. 44 45 Params: 46 locator = the locator that is set to oject. 47 48 Returns: 49 LocatorAware. 50 **/ 51 @property LocatorAware locator(Locator!(Type, KeyType) locator) @safe nothrow; 52 } 53 } 54 55 /** 56 Denotes a Locator that can delegate resource/object location to another Locator if it is available. 57 58 Denotes a Locator that can delegate resource/object location to another Locator if it is available. 59 It is used to denote that a Locator when it doesn't contain the requested object will try to search it in another 60 Locator if it is available, and if it doesn't contain the resource it will throw NotFoundException. 61 62 Note: 63 A locator when delegates the task of resource location it should first check if locator in chain contains the 64 object first, and fetch it afterwards. Such method is used to avoid an infinite loop when several DelegatingLocator are 65 chained in a loop. 66 **/ 67 alias DelegatingLocator = LocatorAware; 68 69 /** 70 Mixin implementing LocatorAware interface for a component of type T. 71 **/ 72 @safe mixin template LocatorAwareMixin(T : LocatorAware!(Z, X), Z, X) { 73 mixin LocatorAwareMixin!(Z, X); 74 } 75 76 /** 77 ditto 78 **/ 79 @safe mixin template LocatorAwareMixin(Type = Object, KeyType = string) { 80 import aermicioi.aedi.storage.locator; 81 private { 82 Locator!(Type, KeyType) locator_; 83 } 84 85 @property { 86 /** 87 Set locator 88 89 Params: 90 locator = the locator used somehow by locator aware component 91 92 Returns: 93 typeof(this) 94 **/ 95 typeof(this) locator(Locator!(Type, KeyType) locator) @safe nothrow 96 in (locator !is null, "A locator is expected not null.") 97 { 98 this.locator_ = locator; 99 100 return this; 101 } 102 103 /** 104 Get locator 105 106 Returns: 107 Locator!(Type, KeyType) 108 **/ 109 inout(Locator!(Type, KeyType)) locator() @safe nothrow inout 110 out(lc; lc !is null, "Cannot return a locator, when it wasn't set in first case.") { 111 return this.locator_; 112 } 113 } 114 } 115 116 /** 117 Mixin implementing LocatorAware interface for a component of type T delegating to a decorated instance. 118 **/ 119 @safe mixin template LocatorAwareDecoratorMixin(T : LocatorAware!(Z, X), Z, X) { 120 mixin LocatorAwareDecoratorMixin!(Z, X); 121 } 122 123 @safe mixin template LocatorAwareDecoratorMixin(Type = Object, KeyType = string) { 124 import aermicioi.aedi.storage.locator; 125 @property { 126 /** 127 Set locator 128 129 Params: 130 locator = the locator used somehow by locator aware component 131 132 Returns: 133 typeof(this) 134 **/ 135 typeof(this) locator(Locator!(Type, KeyType) locator) @safe 136 in (locator !is null, "A locator is expected not null.") 137 { 138 this.decorated.locator = locator; 139 140 return this; 141 } 142 143 /** 144 Get locator 145 146 Returns: 147 Locator!(Type, KeyType) 148 **/ 149 inout(Locator!(Type, KeyType)) locator() @safe inout 150 out(lc; lc !is null, "Cannot return a locator, when it wasn't set in first case.") { 151 return this.decorated.locator; 152 } 153 } 154 }