Class: SugarCube::Anonymous

Inherits:
Hash
  • Object
show all
Defined in:
lib/cocoa/sugarcube-anonymous/anonymous.rb

Overview

A subclass of Hash that allows its keys to be accessed and assigned by method name. Useful to quickly mock objects. To that end, a ‘NoMethodError` is raised anytime the key doesn’t exist (getter or setter)

You can convert an existing Hash or NSDictionary into a Anonymous using the constructor ‘SugarCube::Anonymous`, or you can call `to_object` on a dictionary or hash.

Examples:

obj = {
  'first_name': 'Katsuyoshi',  # strings
  company: 'Ito Soft Design',  # and symbols are supported
  great: true,
}.to_object

obj.first_name
# => 'Katsuyoshi'
obj.company
# => 'Ito Soft Design'
# adding a '?' will return true/false
obj.great?
# => true
obj.great
# => true

obj.bla  # => raises NoMethodError
obj.bla = 'bla'  # => raises NoMethodError

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/cocoa/sugarcube-anonymous/anonymous.rb', line 31

def method_missing(symbol, *args)
  if args.size == 0
    if symbol.to_s[-1] == '?'
      symbol = symbol.to_s[0...-1].to_sym
      return_bool = true
    else
      return_bool = false
    end
    key = symbol
    key = symbol.to_s unless self.include? key
    if self.include?(key)
      self[key] = self[key].to_object
      if return_bool
        return !! self[key]
      end
      return self[key]
    end
  elsif args.size == 1 && /(.*)=$/ =~ symbol.to_s
    key = $1.to_sym
    key = key.to_s unless self.include? key
    if self.include?(key)
      return self[key] = args.first.to_object
    end
  end
  return super
end

Instance Method Details

#anonymous_eachObject

replace enumerable methods



69
# File 'lib/cocoa/sugarcube-anonymous/anonymous.rb', line 69

alias :anonymous_each :each

#eachObject



71
72
73
# File 'lib/cocoa/sugarcube-anonymous/anonymous.rb', line 71

def each
  anonymous_each {|k,v| yield k, v.to_object}
end

#hash_respond_to?Object



58
# File 'lib/cocoa/sugarcube-anonymous/anonymous.rb', line 58

alias_method :hash_respond_to?, :respond_to?

#respond_to?(method_name) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
62
# File 'lib/cocoa/sugarcube-anonymous/anonymous.rb', line 59

def respond_to?(method_name)
  return true if self.include?(method_name) or hash_respond_to?(method_name)
  false
end

#to_objectObject



64
65
66
# File 'lib/cocoa/sugarcube-anonymous/anonymous.rb', line 64

def to_object
  self
end