Sha256: b2766e7ee8e638c9e9de11c765a9ec1f02978388d5fec253ecda118636d39fe5

Contents?: true

Size: 1.3 KB

Versions: 5

Compression:

Stored size: 1.3 KB

Contents

require 'delegate'

module Dry
  module System
    module Plugins
      module Monitoring
        # @api private
        class Proxy < SimpleDelegator
          # @api private
          def self.for(target, key:, methods: [], &block)
            monitored_methods =
              if methods.empty?
                target.public_methods - Object.public_instance_methods
              else
                methods
              end

            Class.new(self) do
              extend Dry::Core::ClassAttributes
              include Dry::Events::Publisher[target.class.name]

              defines :monitored_methods

              attr_reader :__notifications__

              monitored_methods(monitored_methods)

              monitored_methods.each do |meth|
                define_method(meth) do |*args, &block|
                  object = __getobj__
                  opts = { target: key, object: object, method: meth, args: args }

                  __notifications__.instrument(:monitoring, opts) do
                    object.public_send(meth, *args, &block)
                  end
                end
              end
            end
          end

          def initialize(target, notifications)
            super(target)
            @__notifications__ = notifications
          end
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
dry-system-0.12.0 lib/dry/system/plugins/monitoring/proxy.rb
dry-system-0.11.0 lib/dry/system/plugins/monitoring/proxy.rb
dry-system-0.10.1 lib/dry/system/plugins/monitoring/proxy.rb
dry-system-0.10.0 lib/dry/system/plugins/monitoring/proxy.rb
dry-system-0.9.2 lib/dry/system/plugins/monitoring/proxy.rb