Sha256: 0bbc75b22ce7aae0bb940327a748a18c1032a57fe597514c8b4536ccf43d375f

Contents?: true

Size: 1.37 KB

Versions: 2

Compression:

Stored size: 1.37 KB

Contents

module Consul
  module Power

    def self.included(base)
      base.extend ActiveSupport::Memoizable
      base.extend ClassMethods
    end

    def include?(name, *args)
      args = args.dup
      record = args.shift
      power_value = send(name)
      if record.nil? || boolean_or_nil?(power_value)
        !!power_value
      else
        power_ids_name = self.class.power_ids_name(name)
        send(power_ids_name, *args).include?(record.id)
      end
    end

    def include!(*args)
      include?(*args) or raise Consul::Powerless.new("No power to #{args.inspect}")
    end

    private

    def boolean_or_nil?(value)
      [TrueClass, FalseClass, NilClass].include?(value.class)
    end

    module ClassMethods

      def power(name, &block)
        define_method(name, &block)
        define_method("#{name.to_s}?") { |*args| include?(name, *args) }
        define_method("#{name.to_s}!") { |*args| include!(name, *args) }
        define_method("#{name.to_s.singularize}?") { |*args| include?(name, *args) }
        define_method("#{name.to_s.singularize}!") { |*args| include!(name, *args) }
        ids_method = power_ids_name(name)
        define_method(ids_method) { |*args| send(name, *args).scoped(:select => 'id').collect(&:id) }
        memoize ids_method
        name
      end

      def power_ids_name(name)
        "#{name.to_s.singularize}_ids"
      end

    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
consul-0.1.1 lib/consul/power.rb
consul-0.1.0 lib/consul/power.rb