Sha256: f0eec9999c377fd4960cf605219354c1ef44ebfc7b55091e8b886736f99a0231

Contents?: true

Size: 1.14 KB

Versions: 2

Compression:

Stored size: 1.14 KB

Contents

# frozen_string_literal: true

require "delegate"

module Solid::Adapters
  module Interface
    module Callbacks
      def extended(impl)
        impl.singleton_class.prepend(self::Methods)
      end

      def included(impl)
        impl.prepend(self::Methods)
      end
    end

    module ClassMethods
      def [](object)
        const_get(:Proxy, false).new(object).extend(self)
      end
    end

    module ProxyDisabled
      extend Core::Proxy::ClassMethods

      def self.new(object)
        object
      end
    end

    DEFINE = lambda do |interface, enabled:|
      proxy = ProxyDisabled

      if enabled
        proxy = ::Class.new(::SimpleDelegator)
        proxy.extend(Core::Proxy::ClassMethods)

        interface.extend(Callbacks)
      end

      interface.const_set(:Proxy, proxy)
      interface.extend(ClassMethods)
    end

    def self.included(interface)
      DEFINE[interface, enabled: Core::Config.instance.interface_enabled]
    end

    module AlwaysEnabled
      def self.included(interface)
        DEFINE[interface, enabled: true]
      end
    end

    private_constant :Callbacks, :ClassMethods, :ProxyDisabled, :DEFINE
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
solid-adapters-1.1.0 lib/solid/adapters/interface.rb
solid-adapters-1.0.0 lib/solid/adapters/interface.rb