Class: HyperResource::Links

Inherits:
Hash
  • Object
show all
Defined in:
lib/hyper_resource/links.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource = nil) ⇒ Links

Returns a new instance of Links.



5
6
7
# File 'lib/hyper_resource/links.rb', line 5

def initialize(resource=nil)
 self._resource = resource || HyperResource.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/hyper_resource/links.rb', line 49

def method_missing(method, *args) # @private
  unless self[method]
    raise NoMethodError, "undefined method `#{method}' for #{self.inspect}"
  end

  if args.count > 0
    self[method].where(*args)
  else
    self[method]
  end
end

Instance Attribute Details

#_resourceObject

Returns the value of attribute _resource.



3
4
5
# File 'lib/hyper_resource/links.rb', line 3

def _resource
  @_resource
end

Instance Method Details

#[](key) ⇒ Object



43
44
45
46
47
# File 'lib/hyper_resource/links.rb', line 43

def [](key) # @private
  return super(key.to_s) if self.has_key?(key.to_s)
  return super(key.to_sym) if self.has_key?(key.to_sym)
  nil
end

#[]=(attr, value) ⇒ Object



39
40
41
# File 'lib/hyper_resource/links.rb', line 39

def []=(attr, value) # @private
  super(attr.to_s, value)
end

#_hr_create_methods!(opts = {}) ⇒ Object

Creates accessor methods in self.class and self._resource.class. Protects against method creation into HyperResource::Links and HyperResource classes. Just subclasses, please!



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/hyper_resource/links.rb', line 12

def _hr_create_methods!(opts={}) # @private
  return if self.class.to_s == 'HyperResource::Links'
  return if self._resource.class.to_s == 'HyperResource'
  return if self.class.send(
    :class_variable_defined?, :@@_hr_created_links_methods)

  self.keys.each do |attr|
    attr_sym = attr.to_sym
    self.class.send(:define_method, attr_sym) do |*args|
      if args.count > 0
        self[attr].where(*args)
      else
        self[attr]
      end
    end

    ## Don't stomp on _resource's methods
    unless _resource.respond_to?(attr_sym)
      _resource.class.send(:define_method, attr_sym) do |*args|
        links.send(attr_sym, *args)
      end
    end
  end

  self.class.send(:class_variable_set, :@@_hr_created_links_methods, true)
end