Sha256: 355a5bb506e5a2cce56afb87685613b46ab839b6da457098ceef21e7beb14105

Contents?: true

Size: 1.83 KB

Versions: 6

Compression:

Stored size: 1.83 KB

Contents

module Cistern::Model
  include Cistern::Attributes::InstanceMethods

  def self.included(klass)
    klass.send(:extend, Cistern::Attributes::ClassMethods)
    klass.send(:include, Cistern::Attributes::InstanceMethods)
    klass.send(:extend, Cistern::Model::ClassMethods)
  end

  def self.service_model(service, klass, name)
    service.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
      def #{name}(attributes={})
        #{klass.name}.new(attributes.merge(service: self))
      end
    EOS
  end

  module ClassMethods
    def service_method(name=nil)
      @_service_method ||= name
    end
  end

  attr_accessor :collection, :service

  def inspect
    Cistern.formatter.call(self)
  end

  def initialize(attributes={})
    merge_attributes(attributes)
  end

  def update(attributes)
    merge_attributes(attributes)
    save
  end

  def save
    raise NotImplementedError
  end

  def reload
    requires :identity

    if data = collection.get(identity)
      new_attributes = data.attributes
      merge_attributes(new_attributes)
      self
    end
  end

  def ==(comparison_object)
    super ||
      (comparison_object.is_a?(self.class) &&
       comparison_object.identity == self.identity &&
       !comparison_object.new_record?)
  end

  alias :eql? :==

  def hash
    if self.identity
      [self.class, self.identity].join(":").hash
    else
      super
    end
  end

  def wait_for(timeout = self.service_class.timeout, interval = self.service_class.poll_interval, &block)
    service_class.wait_for(timeout, interval) { reload && block.call(self) }
  end

  def wait_for!(timeout = self.service_class.timeout, interval = self.service_class.poll_interval, &block)
    service_class.wait_for!(timeout, interval) { reload && block.call(self) }
  end

  def service_class
    self.service ? self.service.class : Cistern
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
cistern-2.2.3 lib/cistern/model.rb
cistern-2.2.1 lib/cistern/model.rb
cistern-2.1.0 lib/cistern/model.rb
cistern-2.0.5 lib/cistern/model.rb
cistern-2.0.4 lib/cistern/model.rb
cistern-2.0.3 lib/cistern/model.rb