Sha256: 80a9be203cc5356c57ebe7829c356aff2be5dbf75d3f09f8b4fec353126bf5fb

Contents?: true

Size: 1.55 KB

Versions: 2

Compression:

Stored size: 1.55 KB

Contents

require 'ice_nine'
require 'ice_nine/core_ext/object'

module MemoryModel::Base::Actionable
  extend ActiveSupport::Concern

  included do
    define_model_callbacks :create, :update, :save, :destroy
    attr_reader :timestamp
  end

  VALID_IVARS = [
    :@deleted,
    :@attributes,
    :@timestamp,
    :@version
  ]

  def commit
    @timestamp = Time.now
    @version   = SecureRandom.hex(6)
    self.class.insert self
    self
  end

  def delete
    @deleted = true
    commit
    freeze
  end

  def deleted?
    !!@deleted
  end

  def deleted_at
    deleted? ? @timestamp : nil
  end

  def destroy
    run_callbacks :destroy do
      delete
    end
  end

  def dup
    deep_dup
  end

  def deep_dup
    Marshal.load Marshal.dump self
  end

  def freeze
    instance_variables.reject { |ivar| ivar.in? VALID_IVARS }.each do |ivar|
      remove_instance_variable ivar if instance_variable_defined?(ivar)
    end
    instance_variables.each { |ivar| instance_variable_get(ivar).freeze }
    deep_freeze
    super
  end

  def save
    callback = persisted? ? :update : :create
    run_callbacks callback do
      run_callbacks :save do
        commit
      end
    end
  end

  def restore
    instance = frozen? ? self.dup : self
    instance.instance_variable_set :@deleted, false
    instance.save
    instance
  end

  module ClassMethods

    def create(attributes={})
      new(attributes).save
    end

    def delete_all
      all.map(&:delete).reject(&:deleted?).empty?
    end

    def destroy_all
      all.map(&:destroy).reject(&:deleted?).empty?
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
memory_model-0.0.2 lib/memory_model/base/actionable.rb
memory_model-0.0.1 lib/memory_model/base/actionable.rb