Sha256: 2ad5f54339887d50231e66baa6bc84fd6176f29376d8b3a1d35ee1a08f5a8686

Contents?: true

Size: 1.59 KB

Versions: 3

Compression:

Stored size: 1.59 KB

Contents

module Pageflow
  # A registry of [Feature} objects.
  #
  # @since 0.9
  class Features
    include Enumerable

    # @api private
    def initialize
      @features = {}
      @enabled_features = []
    end

    # Register a feature that can be enabled for accounts of
    # entries. If the first parameter is a string, a block can be
    # passed to provide the enable method. If only a string is passed,
    # enabling the feature is no-op.
    #
    # @overload register(feature)
    #   @param feature [Feature]
    #
    # @overload register(feature)
    #   @param feature [String]
    #   @yieldparam config [Configuration] Use the block as enable
    #     method.
    #
    # @overload register(feature)
    #   @param feature [String]
    def register(feature, &block)
      if feature.is_a?(String)
        return register(Feature.new(feature, &block))
      end

      if @features.key?(feature.name)
        raise(ArgumentError, "Feature #{feature.name} is already registered.")
      end

      @features[feature.name] = feature
    end

    # Check if a feature has been enabled.
    #
    # @return [Boolean]
    def enabled?(name)
      @enabled_features.include?(name)
    end

    # @api private
    def enable(names, config)
      @enabled_features = names

      names.each do |name|
        raise(ArgumentError, "Cannot enable unknown feature #{name}.") unless @features.key?(name)

        @features[name].enable(config)
      end
    end

    # @api private
    def enable_all(config)
      enable(@features.keys, config)
    end

    def each(&block)
      @features.values.each(&block)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
pageflow-0.9.2 lib/pageflow/features.rb
pageflow-0.9.1 lib/pageflow/features.rb
pageflow-0.9.0 lib/pageflow/features.rb