module EAAL::Result

Public Class Methods

new(prefix, xml) click to toggle source

create a new result derived from ResultBase

# File lib/eaal/result.rb, line 102
def self.new(prefix, xml)
    classname = prefix + 'Result'
    members = []
    values = {}
    if (xml/"eveapi/error").length > 0
      error = (xml/"eveapi/error").first
      raise EAAL::Exception.raiseEveAPIException(error["code"], error.inner_html)
    end
    if (xml/"eveapi/result").length < 1
      raise EAAL::Exception::EAALError.new("Unknown API error, no result element was found")
    end
    elements = (xml/"eveapi/result").first.containers
    elements.each {|element|
        el = EAAL::Result::ResultElement.parse_element(prefix, element)

        members << el.name
        if el.kind_of? EAAL::Rowset::RowsetBase
            values.merge!({el.name => el})
        else
            values.merge!({el.name => el.value})
        end
    }
    if not Object.const_defined? classname
        klass = Object.const_set(classname, Class.new(EAAL::Result::ResultBase))
        klass.class_eval do
            attr_accessor(*members)
        end
    else
        klass = Object.const_get(classname)
    end
    result = klass.new
    result.request_time = (xml/"eveapi/currentTime").first.inner_html
    result.cached_until = (xml/"eveapi/cachedUntil").first.inner_html
    values.each { |key,value|
        # This class may have been set up with some missing keys if the original
        # response that trigged its creation didn't contain certain elements
        # For example, some CharacterSheets don't have an "allianceName" element
        # if the character isn't in an alliance.  This adds them if they're missing
        if(!result.respond_to?("#{key}=".to_sym))
            result.class.class_eval do
                attr_accessor key.to_sym
            end
        end
        result.send(key + "=", value)
    }
    result
end