59 lines
1.6 KiB
Ruby
59 lines
1.6 KiB
Ruby
module CouchRest
|
|
|
|
# Basic attribute support for adding getter/setter + validation
|
|
class Property
|
|
attr_reader :name, :type, :read_only, :alias, :default, :casted, :init_method, :options
|
|
|
|
# attribute to define
|
|
def initialize(name, type = nil, options = {})
|
|
@name = name.to_s
|
|
parse_type(type)
|
|
parse_options(options)
|
|
self
|
|
end
|
|
|
|
|
|
private
|
|
|
|
def parse_type(type)
|
|
if type.nil?
|
|
@type = 'String'
|
|
elsif type.is_a?(Array) && type.empty?
|
|
@type = 'Array'
|
|
else
|
|
@type = type.is_a?(Array) ? [type.first.to_s] : type.to_s
|
|
end
|
|
end
|
|
|
|
def parse_options(options)
|
|
return if options.empty?
|
|
@validation_format = options.delete(:format) if options[:format]
|
|
@read_only = options.delete(:read_only) if options[:read_only]
|
|
@alias = options.delete(:alias) if options[:alias]
|
|
@default = options.delete(:default) unless options[:default].nil?
|
|
@casted = options[:casted] ? true : false
|
|
@init_method = options[:send] ? options.delete(:send) : 'new'
|
|
@options = options
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
class CastedArray < Array
|
|
attr_accessor :casted_by
|
|
|
|
def << obj
|
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
|
super(obj)
|
|
end
|
|
|
|
def push(obj)
|
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
|
super(obj)
|
|
end
|
|
|
|
def []= index, obj
|
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
|
super(index, obj)
|
|
end
|
|
end |