Sha256: f3d76f08da6aba3168ba1926d5bdb183e817d2f5110e885b28541e68057e65cd

Contents?: true

Size: 1.44 KB

Versions: 5

Compression:

Stored size: 1.44 KB

Contents

module CanTango::Ability::Executor
  class Modal < Base    
    def initialize ability, modes, options = {}
      super ability, options
      extract_modes modes
      execute
    end

    module ClassMethods
      def build candidate, modes, options = {}
        new build_ability(candidate, options), modes, options
      end
    end
    extend ClassMethods

    def calculate_rules
      @rules = modes.inject([]) do |result, mode|
        result = result + modal_rules(mode)
        result
      end
      normalize_rules!
    end

    def execute
      return if executed?
      clear_rules!
      calculate_rules
    rescue Exception => e
      debug e.message      
    ensure
      @executed = true
      rules
    end

    def finder
      @finder ||= CanTango::Ability::Mode::Finder.new self
    end

    protected

    def extract_modes modes
      raise ArgumentError, "Modes must defined!" if !modes
      modes = modes.kind_of?(Hash) ? modes_from_option(modes) : modes
      modes = [modes].flatten
      raise ArgumentError, "Modes must be a list of modes to execute!" if modes.blank?
      @modes = modes
    end
    
    def modes_from_option options
      @options.merge! options
      options[:modes] || options[:mode]
    end

    def modal_rules mode
      mode?(mode) ? executor(mode).execute : []
    end

    def executor mode
      @executor ||= finder.executor_for(mode)
    end

    def mode? mode
      modes.include?(mode)
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
cantango-core-0.1.9.3 lib/cantango/ability/executor/modal.rb
cantango-core-0.1.9.2 lib/cantango/ability/executor/modal.rb
cantango-core-0.1.9.1 lib/cantango/ability/executor/modal.rb
cantango-core-0.1.9 lib/cantango/ability/executor/modal.rb
cantango-core-0.1.8 lib/cantango/ability/executor/modal.rb