lib/twitter/base.rb in twitter-5.0.0.rc.1 vs lib/twitter/base.rb in twitter-5.0.0

- old
+ new

@@ -1,108 +1,118 @@ require 'forwardable' +require 'memoizable' require 'twitter/null_object' require 'uri' module Twitter class Base extend Forwardable + include Memoizable attr_reader :attrs alias to_h attrs alias to_hash attrs alias to_hsh attrs - def_delegators :attrs, :delete, :update - # Define methods that retrieve the value from attributes - # - # @param attrs [Array, Symbol] - def self.attr_reader(*attrs) - attrs.each do |attr| - define_attribute_method(attr) - define_predicate_method(attr) + class << self + + # Construct an object from a response hash + # + # @param response [Hash] + # @return [Twitter::Base] + def from_response(response={}) + new(response[:body]) end - end - # Define object methods from attributes - # - # @param klass [Symbol] - # @param key1 [Symbol] - # @param key2 [Symbol] - def self.object_attr_reader(klass, key1, key2=nil) - define_attribute_method(key1, klass, key2) - define_predicate_method(key1) - end + # Define methods that retrieve the value from attributes + # + # @param attrs [Array, Symbol] + def attr_reader(*attrs) + attrs.each do |attr| + define_attribute_method(attr) + define_predicate_method(attr) + end + end - # Define URI methods from attributes - # - # @param attrs [Array, Symbol] - def self.uri_attr_reader(*attrs) - attrs.each do |uri_key| - array = uri_key.to_s.split("_") - index = array.index("uri") - array[index] = "url" - url_key = array.join("_").to_sym - define_uri_method(uri_key, url_key) - define_predicate_method(uri_key, url_key) - alias_method(url_key, uri_key) - alias_method("#{url_key}?", "#{uri_key}?") + # Define object methods from attributes + # + # @param klass [Symbol] + # @param key1 [Symbol] + # @param key2 [Symbol] + def object_attr_reader(klass, key1, key2=nil) + define_attribute_method(key1, klass, key2) + define_predicate_method(key1) end - end - # Dynamically define a method for a URI - # - # @param key1 [Symbol] - # @param key2 [Symbol] - def self.define_uri_method(key1, key2) - define_method(key1) do - memoize(key1) do - ::URI.parse(@attrs[key2]) if @attrs[key2] + # Define URI methods from attributes + # + # @param attrs [Array, Symbol] + def uri_attr_reader(*attrs) + attrs.each do |uri_key| + array = uri_key.to_s.split("_") + index = array.index("uri") + array[index] = "url" + url_key = array.join("_").to_sym + define_uri_method(uri_key, url_key) + alias_method(url_key, uri_key) + define_predicate_method(uri_key, url_key) + alias_method(:"#{url_key}?", :"#{uri_key}?") end end - end - # Dynamically define a method for an attribute - # - # @param key1 [Symbol] - # @param klass [Symbol] - # @param key2 [Symbol] - def self.define_attribute_method(key1, klass=nil, key2=nil) - define_method(key1) do - memoize(key1) do + # Define display_uri attribute methods + def display_uri_attr_reader + define_attribute_method(:display_url) + alias_method(:display_uri, :display_url) + define_predicate_method(:display_uri, :display_url) + alias_method(:display_url?, :display_uri?) + end + + private + + # Dynamically define a method for a URI + # + # @param key1 [Symbol] + # @param key2 [Symbol] + def define_uri_method(key1, key2) + define_method(key1) do || + URI.parse(@attrs[key2]) if @attrs[key2] + end + memoize(key1) + end + + # Dynamically define a method for an attribute + # + # @param key1 [Symbol] + # @param klass [Symbol] + # @param key2 [Symbol] + def define_attribute_method(key1, klass=nil, key2=nil) + define_method(key1) do || if klass.nil? @attrs[key1] else if @attrs[key1] - if key2.nil? - Twitter.const_get(klass).new(@attrs[key1]) - else - attrs = @attrs.dup - value = attrs.delete(key1) - Twitter.const_get(klass).new(value.update(key2 => attrs)) - end + attrs = attrs_for_object(key1, key2) + Twitter.const_get(klass).new(attrs) else - Twitter::NullObject.instance + NullObject.new end end end + memoize(key1) end - end - # Dynamically define a predicate method for an attribute - # - # @param key [Symbol] - def self.define_predicate_method(key1, key2=key1) - define_method(:"#{key1}?") do - !!@attrs[key2] + # Dynamically define a predicate method for an attribute + # + # @param key1 [Symbol] + # @param key2 [Symbol] + def define_predicate_method(key1, key2=key1) + define_method(:"#{key1}?") do || + !!@attrs[key2] + end + memoize(:"#{key1}?") end - end - # Construct an object from a response hash - # - # @param response [Hash] - # @return [Twitter::Base] - def self.from_response(response={}) - new(response[:body]) end # Initializes a new object # # @param attrs [Hash] @@ -118,29 +128,18 @@ send(method.to_sym) rescue NoMethodError nil end - def memoize(key, &block) - ivar = :"@#{key}" - return instance_variable_get(ivar) if instance_variable_defined?(ivar) - result = block.call - instance_variable_set(ivar, result) - end - private - # @param attr [Symbol] - # @param other [Twitter::Base] - # @return [Boolean] - def attr_equal(attr, other) - self.class == other.class && !other.send(attr.to_sym).nil? && send(attr.to_sym) == other.send(attr.to_sym) - end - - # @param other [Twitter::Base] - # @return [Boolean] - def attrs_equal(other) - self.class == other.class && !other.attrs.empty? && attrs == other.attrs + def attrs_for_object(key1, key2=nil) + if key2.nil? + @attrs[key1] + else + attrs = @attrs.dup + attrs.delete(key1).merge(key2 => attrs) + end end end end