Sha256: 83e233b98772807f8306ebaa0b83a29bace49c6dd1ca6a01332ce567459d8bb3

Contents?: true

Size: 1.4 KB

Versions: 1

Compression:

Stored size: 1.4 KB

Contents

require 'sinatra/base'
require 'sinatra/async'

module Powcloud
  module Insurance
    module HttpService
      # Establish base case for http services, useful for later patching which doesn't touch Sinatra::Base.
      class HttpServiceBase < Sinatra::Base
        def self.agent
          self.send :class_variable_get, :@@agent
        end

        def agent
          self.class.agent
        end
      end

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

      module ClassMethods
        def http_service(opts = {}, &blk)
          self.send :class_variable_set, :@@http_service_block, blk
        end
      end


      # Instance method!
      # Creates unique HttpService class per agent instance.
      def create_http_service
        agent_instance = self

        block = self.class.send(:class_variable_get, :@@http_service_block)
        http_service_class = Class.new(HttpServiceBase) do |clazz|
          # NOTE: @@agent will create Class::@@agent variable, instad of http_service_class1::@@agent 
          class_variable_set(:@@agent, agent_instance)
        end

        # NOTE: Sinatra::Base.inherited callback is not called yet during do |clazz| block above.
        # This is why the following is going here, not in that block.
        http_service_class.register Sinatra::Async

        http_service_class.class_eval(&block)
        http_service_class
      end
    end
  end
end
 

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
powcloud-insurance-0.1.0 lib/powcloud/insurance/http_service.rb