Sha256: 8ac8258ab662536e86bc82f86d2cc3d98b39cad17e6c2a6577964df72ff351a2

Contents?: true

Size: 1.65 KB

Versions: 1

Compression:

Stored size: 1.65 KB

Contents

module Persistent
  module Settings
    include ActiveModel::Serialization

    def self.included(base)
      base.send :extend, Persistent::Settings::ClassMethods
      base.send :extend, Persistent::Settings::Caching
      base.send :extend, Persistent::Settings::Persistance
      base.send :serialize, :value
    end

    module ClassMethods
      @@mutex = Mutex.new
      @@accessors = []

      def method_missing(method_name, *args)
        if assignation?(method_name)
          self.define_setter_and_getter(method_name)
          self.send(method_name, args.first)
        elsif accessors.include?(method_name)
          nil
        else
          super
        end
      end

      def define_setter_and_getter(method_name)
        getter = method_name.to_s.chop

        (class << self; self; end).instance_eval do
          define_method method_name do |value|
            @@mutex.synchronize do
              persist(getter, value)
              write_to_cache getter, value
            end
          end

          define_method getter do
            value = read_from_cache getter
            unless value
              value = read_from_persistance getter
              write_to_cache getter, value
            end
            value
          end
        end
      end

      def assignation?(method_name)
        method_name.to_s.match(/=$/)
      end

      def ready?
        connected? && table_exists?
      end

      def keys
        self.select(:var).collect { |s| s.var.to_sym }
      end

      def accessors
        @@accessors
      end

      private
      def attr_accessor(*args)
        @@accessors << args[0]
        super(*args)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
persistent_settings-1.3.0 lib/persistent/settings.rb