950: def read(attr, *arguments)
951: attr = attr.to_s
952: self.class.prepare_read_parameters(attr, arguments)
953: data_hash_key = [attr] + arguments
954: reader = self.class.reader(attr)
955: loader = self.class.loader(attr)
956: synchronize do
957: if reader
958: return reader.call(self, arguments)
959: elsif @data_hash.has_key?(data_hash_key)
960: return @data_hash[data_hash_key]
961: elsif loader
962: loader.call(FlexiRecord::RecordArray.new(self.class, [self]), arguments)
963: unless @data_hash.has_key?(data_hash_key)
964: raise "Record loader failed."
965: end
966: end
967: return @data_hash[data_hash_key]
968: end
969: end