module Featuring::Flaggable

Internal concerns related to defining feature flags on a module or class.

Public Class Methods

extended(object) click to toggle source
Calls superclass method
# File lib/featuring/flaggable.rb, line 11
def self.extended(object)
  super

  case object
  when Class
    object.include object.internal_feature_checks_module
  when Module
    object.extend object.internal_feature_checks_module
  end
end
setup_flaggable_object(object) click to toggle source
# File lib/featuring/flaggable.rb, line 22
def self.setup_flaggable_object(object)
  case object
  when Class
    object.extend ClassMethods
    object.prepend InstanceMethods
  when Module
    object.extend Flaggable
    object.extend Delegatable
    object.extend Serializable
  end
end

Public Instance Methods

define_feature_flag(name, default, &block) click to toggle source
# File lib/featuring/flaggable.rb, line 46
def define_feature_flag(name, default, &block)
  # Define a feature check method that returns the default value or the block's return value.
  #
  internal_feature_module.module_eval do
    if method_defined?(name)
      undef_method(name)
    end

    if block
      define_method name, &block
    else
      define_method name do
        default
      end
    end
  end

  # Define a method that typecasts the value returned from the delegator to true/false. This is
  # the method that's called when calling code asks if a feature is enabled. It guarantees that
  # only true or false is returned when checking a feature flag.
  #
  internal_feature_checks_module.module_eval do
    method_name = "#{name}?"

    if method_defined?(method_name)
      undef_method(method_name)
    end

    define_method method_name do |*args|
      fetch_feature_flag_value(name, *args)
    end
  end

  # Keep track of the feature flag we just defined.
  #
  feature_flags << name
end
feature_flags() click to toggle source
# File lib/featuring/flaggable.rb, line 84
def feature_flags
  @_feature_flags ||= []
end
internal_feature_checks_module() click to toggle source

Contains methods that wrap the original values to typecast them into true or false values.

# File lib/featuring/flaggable.rb, line 42
def internal_feature_checks_module
  @_internal_feature_checks_module ||= Module.new
end
internal_feature_module() click to toggle source

Contains methods that return the feature’s original default value, or block value.

# File lib/featuring/flaggable.rb, line 36
def internal_feature_module
  @_internal_feature_module ||= Module.new
end