Sha256: f52152184bd7684e1eaa7b732b13101b6756c9cfa1f475d1f88ad79d548e7960

Contents?: true

Size: 1.76 KB

Versions: 18

Compression:

Stored size: 1.76 KB

Contents

module Contracts
  module Engine
    # Represents class in question
    class Target
      # Creates new instance of Target
      #
      # @param [Class] target - class in question
      def initialize(target)
        @target = target
      end

      # Enable contracts engine for target
      # - it is no-op if contracts engine is already enabled
      # - it automatically enables contracts engine for its eigenclass
      # - it sets owner class to target for its eigenclass
      #
      # @param [Engine::Base:Class] engine_class - type of engine to
      #   enable (Base or Eigenclass)
      def apply(engine_class = Base)
        return if applied?

        apply_to_eigenclass

        eigenclass.class_eval do
          define_method(:__contracts_engine) do
            @__contracts_engine ||= engine_class.new(self)
          end
        end

        engine.set_eigenclass_owner
      end

      # Returns true if target has contracts engine already
      #
      # @return [Bool]
      def applied?
        target.respond_to?(:__contracts_engine)
      end

      # Returns contracts engine of target
      #
      # @return [Engine::Base or Engine::Eigenclass]
      def engine
        applied? && target.__contracts_engine
      end

      private

      attr_reader :target

      def apply_to_eigenclass
        return unless meaningless_eigenclass?

        self.class.new(eigenclass).apply(Eigenclass)
        eigenclass.extend(MethodDecorators)
        # FIXME; this should detect what user uses `include Contracts` or
        # `include Contracts;;Core`
        eigenclass.send(:include, Contracts)
      end

      def eigenclass
        Support.eigenclass_of(target)
      end

      def meaningless_eigenclass?
        !Support.eigenclass?(target)
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 6 rubygems

Version Path
entitlements-app-1.2.0 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-1.1.0 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-1.0.0 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-0.3.4 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-0.3.1 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-0.3.0 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-0.2.1 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-0.2.1 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-0.2.0 lib/contracts-ruby2/lib/contracts/engine/target.rb
entitlements-app-0.2.0 lib/contracts-ruby2/lib/contracts/engine/target.rb
contracts-0.16.1 lib/contracts/engine/target.rb
files.com-1.0.55 docs/vendor/bundle/ruby/2.5.0/gems/contracts-0.13.0/lib/contracts/engine/target.rb
honeybadger-4.5.3 vendor/bundle/ruby/2.6.0/gems/contracts-0.16.0/lib/contracts/engine/target.rb
contracts-0.16.0 lib/contracts/engine/target.rb
contracts-0.15.0 lib/contracts/engine/target.rb
contracts-lite-0.14.0 lib/contracts/engine/target.rb
contracts-0.14.0 lib/contracts/engine/target.rb
contracts-0.13.0 lib/contracts/engine/target.rb