Sha256: 59a3687eb172a06098fccfd46673b919178633b7d64d9e2c587c65b4bb0ea6a6

Contents?: true

Size: 1.33 KB

Versions: 8

Compression:

Stored size: 1.33 KB

Contents

module Adva
  module HasOptions
    def self.included(base)
      base.class_eval do
        extend ClassMethods
        class_attribute :option_definitions, default: {}
        serialize :options
      end
    end

    module ClassMethods
      def has_option(*names)
        definition = names.extract_options!
        names.each do |name|
          self.option_definitions[name] = definition.reverse_update(:default => nil, :type => :text_field)
          class_eval <<-src, __FILE__, __LINE__
            def #{name}
              #{name}_before_type_cast
            end

            def #{name}_before_type_cast
              self.options ||= {}
              options.key?(:#{name}) ? options[:#{name}] : self.class.option_definition(:#{name}, :default)
            end

            def #{name}=(value)
              options_will_change!
              if self.class.option_definition(:#{name}, :type) == :boolean
                value = ActiveRecord::Type::Boolean.new.cast(value)
              end
              self.options ||= {}
              options[:#{name}] = value
            end
          src
        end
      
        def option_definition(name, key)
          option_definitions[name][key]
        rescue
          superclass.option_definition(name, key) unless self.class.superclass == ActiveRecord::Base
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
adva-0.3.2 lib/adva/has_options.rb
adva-0.3.1 lib/adva/has_options.rb
adva-0.3.0 lib/adva/has_options.rb
adva-0.2.4 lib/adva/has_options.rb
adva-0.2.3 lib/adva/has_options.rb
adva-0.2.2 lib/adva/has_options.rb
adva-0.2.1 lib/adva/has_options.rb
adva-0.2.0 lib/adva/has_options.rb