Sha256: e901dc0af168931c41e6d49df9e790de8ac06d1daefea3a134bfd9d978dc22a2

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

module Chanko
  class ActiveIf
    class << self
      def define(label, &block)
        definitions[label] = block
      end

      def find(label)
        definitions[label]
      end

      def definitions
        @definitions ||= {}
      end

      def clear
        definitions.clear
      end
    end

    attr_reader :conditions, :options

    def initialize(*conditions, &block)
      @options    = conditions.extract_options!
      @conditions = conditions
      @block      = block
    end

    def active?(context, options = {})
      blocks.all? {|block| block.call(context, options) }
    end

    def blocks
      @blocks ||= begin
        conditions.map do |condition|
          Block.new(condition)
        end << @block
      end.compact
    end

    class Block
      def initialize(*conditions)
        @conditions = conditions
      end

      def call(context, options)
        block.call(context, options)
      end

      def block
        condition = @conditions.first
        condition.is_a?(Block) ? condition : ActiveIf.find(condition)
      end
    end

    class Any < Block
      def block
        proc do |context, options|
          @conditions.any? do |condition|
            Block.new(condition).call(context, options)
          end
        end
      end
    end

    class None < Block
      def block
        proc do |context, options|
          @conditions.none? do |condition|
            Block.new(condition).call(context, options)
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
chanko-2.0.1 lib/chanko/active_if.rb