Sha256: 4993fc2cb69a140fd2105d5c62c11882e9b23f42104e5556d9d65f9d94130041

Contents?: true

Size: 939 Bytes

Versions: 3

Compression:

Stored size: 939 Bytes

Contents

module Dry
  module Types
    module Decorator
      attr_reader :type, :options

      def initialize(type, options = {})
        @type = type
        @options = options
      end

      def constructor
        type.constructor
      end

      def with(new_options)
        self.class.new(type, options.merge(new_options))
      end

      def valid?(value)
        type.valid?(value)
      end

      def respond_to_missing?(meth, include_private = false)
        super || type.respond_to?(meth)
      end

      private

      def decorate?(response)
        response.kind_of?(type.class)
      end

      def method_missing(meth, *args, &block)
        if type.respond_to?(meth)
          response = type.__send__(meth, *args, &block)

          if decorate?(response)
            self.class.new(response, options)
          else
            response
          end
        else
          super
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-types-0.7.2 lib/dry/types/decorator.rb
dry-types-0.7.1 lib/dry/types/decorator.rb
dry-types-0.7.0 lib/dry/types/decorator.rb