joekhoobyar/cardiac

View on GitHub
lib/cardiac/operation_builder.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Cardiac
  class OperationBuilder < ResourceBuilder
    attr_writer :klass

  protected
  
    # Checks if the given HTTP method is allowed.
    def http_method_allowed?(verb=@base.method_value)
      @base.allowed_http_methods.include?(verb)
    end

  private
  
    # Overridden to support :call when a verb is implied.
    def respond_to_missing?(name,include_private=false)
      unless name == :call then super else 
        @base.method_value.present? && http_method_allowed?(@base.method_value)
      end
    end
  
    # Overridden to respond to HTTP verbs.
    def check_builder_method?(name)
      super(name) || http_method_allowed?(name)
    end
    
    # Overridden to respond to HTTP verbs.
    def method_missing name, *args, &block
      name = @base.send(:build_method) if name == :call
      if http_method_allowed? name
        call!(name, *args, &block)
      else
        super
      end
    end
    
    # This builder does not actually perform calls, but does record the HTTP verb.
    def call!(name, *args, &block)
      if @base.method_value==name then self else
        build! :http_method, name
      end
    end
    
    # Overridden to assign the :klass.
    def build!(name, *args, &block)
      b = super
      b.klass = @klass
      b
    end
    
    # Overridden to assign the :klass.
    def extend!(*extensions, &extension_block)
      b = super
      b.klass = @klass
      b
    end
  end
  
  class OperationProxy < OperationBuilder
    
  private
    
    # Overridden to actually perform the call and return the payload.
    def call!(name, *args, &block)
      built = super
      resolved = __adapter__.new(@klass, built.to_resource)
      resolved.call!(*args, &block)
      resolved.result.payload
    end
  
    def self.__adapter__
      @__adapter__ ||= ::Cardiac::ResourceAdapter
    end
    
    delegate :__adapter__, to: 'self.class'
    
  end
end