class Invoiced::Object

Attributes

client[R]

Public Class Methods

new(client, id=nil, values={}) click to toggle source
# File lib/invoiced/object.rb, line 9
def initialize(client, id=nil, values={})
    @client = client
    @endpoint_base = ''
    @endpoint = build_endpoint
    @id = id
    @values = {}

    if !id.nil?
        @endpoint += "/#{id}"
        @unsaved = Set.new
        refresh_from(values.dup.merge({:id => id}))
    end
end

Public Instance Methods

[](k) click to toggle source
# File lib/invoiced/object.rb, line 83
def [](k)
    @values[k.to_sym]
end
[]=(k, v) click to toggle source
# File lib/invoiced/object.rb, line 87
def []=(k, v)
    send(:"#{k}=", v)
end
add_accessors(keys) click to toggle source
# File lib/invoiced/object.rb, line 129
def add_accessors(keys)
    metaclass.instance_eval do
        keys.each do |k|
            next if @@permanent_attributes.include?(k)
            k_eq = :"#{k}="
            define_method(k) { @values[k] }
            define_method(k_eq) do |v|
                if v == ""
                    raise ArgumentError.new(
                        "You cannot set #{k} to an empty string." \
                        "We interpret empty strings as nil in requests." \
                        "You may set #{self}.#{k} = nil to delete the property.")
                end
                @values[k] = v
                @unsaved.add(k)
            end
        end
    end
end
build_endpoint() click to toggle source
# File lib/invoiced/object.rb, line 36
def build_endpoint
    if self.class.const_defined? "OBJECT_NAME"
        '/' + self.class::OBJECT_NAME + 's'
    else
        '/objects'
    end
end
each(&blk) click to toggle source
# File lib/invoiced/object.rb, line 110
def each(&blk)
    @values.each(&blk)
end
endpoint() click to toggle source
# File lib/invoiced/object.rb, line 32
def endpoint()
    @endpoint_base + @endpoint
end
endpoint_base() click to toggle source
# File lib/invoiced/object.rb, line 28
def endpoint_base()
    @endpoint_base
end
inspect() click to toggle source
# File lib/invoiced/object.rb, line 58
def inspect
    id_string = (!@id.nil?) ? " id=#{@id}" : ""
    "#<#{self.class}:0x#{object_id.to_s(16)}#{id_string}> JSON: " + JSON.pretty_generate(@values)
end
keys() click to toggle source
# File lib/invoiced/object.rb, line 91
def keys
    @values.keys
end
metaclass() click to toggle source
# File lib/invoiced/object.rb, line 114
def metaclass
    class << self; self; end
end
method_missing(name, *args) click to toggle source
Calls superclass method
# File lib/invoiced/object.rb, line 149
def method_missing(name, *args)
    if name.to_s.end_with?('=')
        attr = name.to_s[0...-1].to_sym
        add_accessors([attr])
        begin
            mth = method(name)
        rescue NameError
            raise NoMethodError.new("Cannot set #{attr} on this object. HINT: you can't set: #{@@permanent_attributes.to_a.join(', ')}")
        end
        return mth.call(args[0])
    else
        return @values[name] if @values.has_key?(name)
    end

    begin
        super
    rescue NoMethodError => e
        raise e
    end
end
refresh_from(values) click to toggle source
# File lib/invoiced/object.rb, line 63
def refresh_from(values)
    removed = Set.new(@values.keys - values.keys)
    added = Set.new(values.keys - @values.keys)

    instance_eval do
        remove_accessors(removed)
        add_accessors(added)
    end
    removed.each do |k|
        @values.delete(k)
        @unsaved.delete(k)
    end
    values.each do |k, v|
        @values[k] = v
        @unsaved.delete(k)
    end

    return self
end
remove_accessors(keys) click to toggle source
# File lib/invoiced/object.rb, line 118
def remove_accessors(keys)
    metaclass.instance_eval do
        keys.each do |k|
            next if @@permanent_attributes.include?(k)
            k_eq = :"#{k}="
            remove_method(k) if method_defined?(k)
            remove_method(k_eq) if method_defined?(k_eq)
        end
    end
end
retrieve(id, params={}) click to toggle source
# File lib/invoiced/object.rb, line 44
def retrieve(id, params={})
    if !id
        raise ArgumentError.new("Missing ID.")
    end

    response = @client.request(:get, "#{endpoint()}/#{id}", params)

    Util.convert_to_object(self, response[:body])
end
set_endpoint_base(base) click to toggle source
# File lib/invoiced/object.rb, line 23
def set_endpoint_base(base)
    @endpoint_base = base
    self
end
to_hash() click to toggle source
# File lib/invoiced/object.rb, line 103
def to_hash
    @values.inject({}) do |acc, (key, value)|
        acc[key] = value.respond_to?(:to_hash) ? value.to_hash : value
        acc
    end
end
to_json(*a) click to toggle source
# File lib/invoiced/object.rb, line 99
def to_json(*a)
    JSON.generate(@values)
end
to_s(*args) click to toggle source
# File lib/invoiced/object.rb, line 54
def to_s(*args)
    JSON.pretty_generate(@values)
end
values() click to toggle source
# File lib/invoiced/object.rb, line 95
def values
    @values.values
end