Sha256: aaed75cf0c6e74c7fefc7d061a01c46fa00c1419c683bfb109438702c58cd116

Contents?: true

Size: 1.29 KB

Versions: 10

Compression:

Stored size: 1.29 KB

Contents

require 'paradocs/base_policy'

module Paradocs
  class ConfigurationError < StandardError; end

  class Registry
    attr_reader :policies

    def initialize
      @policies = {}
    end

    def coercions
      policies
    end

    def policy(name, plcy = nil, &block)
      validate_policy_class(plcy) if plcy

      policies[name] = (plcy || BasePolicy.build(name, :instance_eval, &block))
      self
    end

  private

    def validate_policy_class(plcy)
      plcy_cls = plcy.is_a?(Class) ? plcy : plcy.class
      if plcy_cls < Paradocs::BasePolicy
        valid_overriden = plcy_cls.instance_method(:valid?).source_location != Paradocs::BasePolicy.instance_method(:valid?).source_location
        raise ConfigurationError.new("Overriding #valid? in #{plcy_cls} is forbidden. Override #validate instead") if valid_overriden
      else
        required_methods = [:valid?, :coerce, :eligible?, :meta_data, :policy_name] - plcy_cls.instance_methods
        raise ConfigurationError.new("Policy #{plcy_cls} should respond to #{required_methods}") unless required_methods.empty?

        return plcy unless Paradocs.config.explicit_errors
        return plcy if plcy_cls.respond_to?(:errors)
        raise ConfigurationError.new("Policy #{plcy_cls} should respond to .errors method")
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
paradocs-1.1.6 lib/paradocs/registry.rb
paradocs-1.1.5 lib/paradocs/registry.rb
paradocs-1.1.4 lib/paradocs/registry.rb
paradocs-1.1.3 lib/paradocs/registry.rb
paradocs-1.1.2 lib/paradocs/registry.rb
paradocs-1.1.1 lib/paradocs/registry.rb
paradocs-1.1.0 lib/paradocs/registry.rb
paradocs-1.0.24 lib/paradocs/registry.rb
paradocs-1.0.23 lib/paradocs/registry.rb
paradocs-1.0.22 lib/paradocs/registry.rb