Sha256: c4a4e8207465b934eb83fc44219916b28d21f450dbced155d7249da28875f992

Contents?: true

Size: 918 Bytes

Versions: 4

Compression:

Stored size: 918 Bytes

Contents

module Yoda
  module HasServices
    module ClassMethods
      # Register a service with the specified name
      # @params name [String]
      def service(name, &block)
        service_hub_class.register_service(name, &block)
        define_method(:"#{name}_service") { services.public_send(name) }
      end

      # @return [Class<ServiceHub>]
      def service_hub_class
        @service_hub_class ||= Class.new(ServiceHub)
      end
    end

    class ServiceHub
      attr_reader :instance

      def initialize(instance)
        @instance = instance
      end

      def self.register_service(name, &block)
        define_method(name) do
          instance.instance_exec(instance, &block)
        end
      end
    end

    # @return [ServiceHub]
    def services
      @services ||= self.class.service_hub_class.new(self)
    end

    def self.included(klass)
      klass.extend ClassMethods
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
yoda-language-server-0.10.1 lib/yoda/has_services.rb
yoda-language-server-0.10.0 lib/yoda/has_services.rb
yoda-language-server-0.9.0 lib/yoda/has_services.rb
yoda-language-server-0.8.0 lib/yoda/has_services.rb