Sha256: 23fd6478d6f1638d11b4ad79f68172fb86423f03bfdd618742b05a0b569c7711

Contents?: true

Size: 1.64 KB

Versions: 5

Compression:

Stored size: 1.64 KB

Contents

module Scram::DSL
  # Module for Models to include to be able to define special condition variables in their targets
  # @note Changes behavior of method_missing! Calling a method prefixed with * will search for scram conditions to invoke
  module ModelConditions
    def self.included(base_class)
      base_class.extend ClassMethods
    end

    module ClassMethods
      # @return [Hash] Mapping of condition names to Procs to execute them
      attr_accessor :scram_conditions

      # Method meant to be used in the including class to begin defining conditions
      #
      # Example
      #   scram_define do
      #     condition :foo do
      #       |instance| "hello world"
      #     end
      #   end
      def scram_define(&block)
        @scram_conditions = Builders::ConditionBuilder.new(&block).conditions
      end
    end

    # Methods starting with an asterisk are tested for DSL defined conditions
    def method_missing(method, *args)
      if method.to_s.starts_with? "*"
        condition_name = method.to_s.split("*")[1].to_sym
        conditions = self.class.scram_conditions
        if conditions && !conditions[condition_name].nil?
          return conditions[condition_name].call(self)
        end
      end
      super
    end

    # Allow DSL condition methods to show up as methods (i.e fix #respond_to?)
    def respond_to_missing?(method, include_private = false)
      if method.to_s.starts_with? "*"
        condition_name = method.to_s.split("*")[1].to_sym
        conditions = self.class.scram_conditions
        if conditions && !conditions[condition_name].nil?
          return true
        end
      end
      super
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
scram-0.1.4 lib/scram/dsl/model_conditions.rb
scram-0.1.3 lib/scram/dsl/model_conditions.rb
scram-0.1.2 lib/scram/dsl/model_conditions.rb
scram-0.1.1 lib/scram/dsl/model_conditions.rb
scram-0.1.0 lib/scram/dsl/model_conditions.rb