Sha256: fb5a5f9d743ab463c85f4e77d846a37ac1f5c4b03022f482c0dcc77055a8b91a

Contents?: true

Size: 1.6 KB

Versions: 2

Compression:

Stored size: 1.6 KB

Contents

require 'set'

module CurrencyCloud

  class Resource
  
    def self.resource(resource=nil)
      @resource ||= resource
    end
    
    def self.actions(*actions)
      @actions ||= actions
      @actions.each do |action|
        self.class_eval do
          action_module = CurrencyCloud::Actions.const_get(action.to_s.capitalize)
          self.extend(action_module)
        end


        self.send(:include, CurrencyCloud::Actions::Save) if action == :update
        self.send(:include, CurrencyCloud::Actions::InstanceDelete) if action == :delete
      end
    end
    
    attr_reader :changed_attributes
    
    def initialize(object)
      @object = object
      @changed_attributes = Set.new
      set_accessors(keys)
    end
    
    def keys
      @object.keys
    end

    def inspect
      "#<#{self.class}:0x#{self.object_id.to_s(16)} #{@object.inspect}>"
    end
    
    private

    def changed?
      !@changed_attributes.empty?
    end
    
    def metaclass
      class << self; self; end
    end
    
    def set_accessors(keys)
      metaclass.instance_eval do
        keys.each do |key|
          define_method(key) { @object[key] }
          define_method("#{key}=".to_sym) do |value|
            @object[key] = value
            @changed_attributes << key
          end
        end
      end
    end

    def self.get(url, params={})
      new(request.get(build_url(url), params))
    end

    def self.post(url, params={})
      new(request.post(build_url(url), params))
    end

    def self.build_url(url)
      "#{self.resource}/#{url}"
    end

    def self.request
      RequestHandler.new
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
currency_cloud-0.7.1 lib/currency_cloud/resource.rb
currency_cloud-0.7 lib/currency_cloud/resource.rb