Sha256: 8c675d46b5ea240d9cda98012a89561ebdbbb843c2638be683e365d684f8cbbb
Contents?: true
Size: 1.99 KB
Versions: 1
Compression:
Stored size: 1.99 KB
Contents
require 'uber/inheritable_attr' require 'representable/decorator' require 'representable/hash' require 'disposable/twin/representer' require 'disposable/twin/option' # Twin.new(model/composition hash, options) # assign hash to @fields # write: write to @fields # sync/save is the only way to write back to the model. module Disposable class Twin extend Uber::InheritableAttr inheritable_attr :representer_class self.representer_class = Class.new(Decorator) def self.property(name, options={}, &block) options[:private_name] = options.delete(:as) || name options[:pass_options] = true representer_class.property(name, options, &block).tap do |definition| mod = Module.new do define_method(name) { read_property(name, options[:private_name]) } define_method("#{name}=") { |value| write_property(name, options[:private_name], value) } # TODO: this is more like prototyping. end include mod end end def self.collection(name, options={}, &block) property(name, options.merge(:collection => true), &block) end module Initialize def initialize(model, options={}) @fields = {} @model = model from_hash(options) # assigns known properties from options. end end include Initialize # read/write to twin using twin's API (e.g. #record= not #album=). def self.write_representer representer = Class.new(representer_class) # inherit configuration end private def read_property(name, private_name) return @fields[name.to_s] if @fields.has_key?(name.to_s) @fields[name.to_s] = read_from_model(private_name) end def read_from_model(getter) model.send(getter) end def write_property(name, private_name, value) @fields[name.to_s] = value end def from_hash(options) self.class.write_representer.new(self).from_hash(options) end attr_reader :model # TODO: test include Option end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
disposable-0.0.7 | lib/disposable/twin.rb |