1018: def method_missing(method_symbol, *arguments)
1019: synchronize do
1020: attr = method_symbol.to_s
1021: if attr[-1, 1] == '='
1022: attr = attr[0, attr.length-1]
1023: mode = :write
1024: value = arguments.pop
1025: else
1026: mode = :read
1027: end
1028: reader = self.class.reader(attr)
1029: loader = self.class.loader(attr)
1030: table_column_existent = self.class.columns.include?(attr)
1031: if mode == :write
1032: data_hash_key = [attr] + arguments
1033: setter = self.class.setter(attr)
1034: if setter
1035: setter.call(self, value)
1036: return nil
1037: elsif @data_hash.has_key?(data_hash_key) or reader or loader or table_column_existent
1038: @data_hash[data_hash_key] = value
1039: return nil
1040: end
1041: elsif mode == :read
1042: self.class.prepare_read_parameters(attr, arguments)
1043: data_hash_key = [attr] + arguments
1044: if reader
1045: return reader.call(self, arguments)
1046: elsif @data_hash.has_key?(data_hash_key)
1047: return @data_hash[data_hash_key]
1048: elsif loader
1049: loader.call(FlexiRecord::RecordArray.new(self.class, [self]), arguments)
1050: unless @data_hash.has_key?(data_hash_key)
1051: puts data_hash_key.inspect
1052: raise "Record loader failed."
1053: end
1054: return @data_hash[data_hash_key]
1055: elsif table_column_existent
1056: unless arguments.empty?
1057: raise ArgumentError, "Attribute getter method does not support arguments."
1058: end
1059: return nil
1060: end
1061: end
1062: return super
1063: end
1064: end