Sha256: 6dcc09a8aa72544a546b43da5559f1bddbeb640e2b5cf510891450333ee8db2e

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

class Cistern::Model
  extend Cistern::Attributes::ClassMethods
  include Cistern::Attributes::InstanceMethods

  attr_accessor :collection, :connection

  def self.formatter
    @formatter ||= Cistern::Formatter::Default
  end

  def self.formatter=(formatter)
    @formatter = formatter
  end

  def inspect
    self.class.formatter.call(self)
  end

  def initialize(attributes={})
    merge_attributes(attributes)
  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)
    comparison_object.equal?(self) ||
      (comparison_object.is_a?(self.class) && 
       comparison_object.identity == self.identity && 
       !comparison_object.new_record?)
  end

  def wait_for(timeout=Cistern.timeout, interval=1, &block)
    reload
    retries = 3
    Cistern.wait_for(timeout, interval) do
      if reload
        retries = 3
      elsif retries > 0
        retries -= 1
        sleep(1)
      elsif retries == 0
        raise Cistern::Error.new("Reload failed, #{self.class} #{self.identity} went away.") # FIXME: pretty much assumes you are calling #ready?
      end
      instance_eval(&block)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cistern-0.1.2 lib/cistern/model.rb