class StatefulFieldFor::Definition

Attributes

attr_name[R]
logic[R]
prefix[R]
scope[R]
suffix[R]

Public Class Methods

included(klass) click to toggle source
# File lib/stateful_field_for/definition.rb, line 15
def self.included(klass)
  __define_scope_for_activate(klass)   if respond_to?(:__define_scope_for_activate)
  __define_scope_for_deactivate(klass) if respond_to?(:__define_scope_for_deactivate)
  __define_after_initialize(klass)     if respond_to?(:__define_after_initialize)
end
new(attr_name, options = {}) click to toggle source
# File lib/stateful_field_for/definition.rb, line 5
def initialize(attr_name, options = {})
  @attr_name = attr_name
  @prefix    = options[:prefix]
  @suffix    = options[:suffix]
  @scope     = options[:scope] || false
  @logic     = (options[:type] == :date) ? "Date.today" : "Time.current"
end

Public Instance Methods

_module() click to toggle source
# File lib/stateful_field_for/definition.rb, line 13
def _module
  @_module ||= Module.new do
    def self.included(klass)
      __define_scope_for_activate(klass)   if respond_to?(:__define_scope_for_activate)
      __define_scope_for_deactivate(klass) if respond_to?(:__define_scope_for_deactivate)
      __define_after_initialize(klass)     if respond_to?(:__define_after_initialize)
    end
  end
end
module_name() click to toggle source
# File lib/stateful_field_for/definition.rb, line 23
def module_name
  "generated_#{attr_name}_stateful_methods".split("_").map(&:camelize).join
end

Private Instance Methods

disable(event_basename, to: nil, initial: false) click to toggle source
# File lib/stateful_field_for/definition.rb, line 61
      def disable(event_basename, to: nil, initial: false)
        event = format_name(event_basename)
        state = to.nil? ? event : format_name(to)

        _module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
          def #{state}?
            #{attr_name}.nil?
          end

          def #{event}
            self.#{attr_name} = nil
          end

          def #{event}!(options = {})
            #{event}
            save!(options)
          end
        RUBY

        _module.module_eval <<-RUBY, __FILE__, __LINE__ + 1 if scope
          def self.__define_scope_for_deactivate(klass)
            klass.scope :#{state}, -> { where(#{attr_name}: nil) }
          end
        RUBY

        _module.module_eval <<-RUBY, __FILE__, __LINE__ + 1 if initial
          def self.__define_after_initialize(klass)
            klass.after_initialize :#{event}
          end
        RUBY
      end
enable(event_basename, to: nil, initial: false) click to toggle source
# File lib/stateful_field_for/definition.rb, line 29
      def enable(event_basename, to: nil, initial: false)
        event = format_name(event_basename)
        state = to.nil? ? event : format_name(to)

        _module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
          def #{state}?
            !#{attr_name}.nil?
          end

          def #{event}
            self.#{attr_name} = #{logic}
          end

          def #{event}!(options = {})
            #{event}
            save!(options)
          end
        RUBY

        _module.module_eval <<-RUBY, __FILE__, __LINE__ + 1 if scope
          def self.__define_scope_for_activate(klass)
            klass.scope :#{state}, -> { where.not(#{attr_name}: nil) }
          end
        RUBY

        _module.module_eval <<-RUBY, __FILE__, __LINE__ + 1 if initial
          def self.__define_after_initialize(klass)
            klass.after_initialize :#{event}
          end
        RUBY
      end
format_name(basename) click to toggle source
# File lib/stateful_field_for/definition.rb, line 93
def format_name(basename)
  [prefix, basename, suffix].compact.join("_")
end