Class: Cardiac::ResourceBuilder

Inherits:
Proxy
  • Object
show all
Defined in:
lib/cardiac/resource/builder.rb

Direct Known Subclasses

OperationBuilder

Instance Method Summary collapse

Methods inherited from Proxy

#respond_to?

Constructor Details

#initialize(base, *extensions, &extension_block) ⇒ ResourceBuilder

Returns a new instance of ResourceBuilder.

Raises:

  • (ArgumentError)


6
7
8
9
10
# File 'lib/cardiac/resource/builder.rb', line 6

def initialize base, *extensions, &extension_block
  raise ArgumentError unless Resource === base
  @base, @extensions, @extension_block = base, extensions, extension_block
  @extensions.compact!
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/cardiac/resource/builder.rb', line 56

def method_missing name, *args, &block
  name = name.to_sym
  
  # Always delegate builder methods.
  if check_builder_method? name
    build! name, *args, &block

  # Only delegate extension methods if the extension module has not been built yet.
  # This allows extensions to be removed by preventing method_missing from calling them.
  elsif @__extension_module__.nil? && check_extension_method?(name)
    #__extension_module__.instance_method(name).bind(self).call(*args, &block)
    __public_send__(name, *args, &block) || self
    
  # Otherwise, the method has not been implemented.
  else
    raise ::NotImplementedError, "#{name.inspect} is not implemented for this builder"
  end
end

Instance Method Details

#__extension_module__Object

Resolves this builder’s extension module, and extends the builder with it.



20
21
22
# File 'lib/cardiac/resource/builder.rb', line 20

def __extension_module__
  @__extension_module__ ||= build_extensions_for_module!{|mod| __extend__ mod }
end

#__extensions__Object

Resolves this builder’s extensions.



25
26
27
28
29
30
# File 'lib/cardiac/resource/builder.rb', line 25

def __extensions__
  @__extensions__ ||= @extensions.dup.tap do |exts|
    exts.unshift @base.__extension_module__ if @base.__extension_module__
    exts.push ::Module.new(&@extension_block) if @extension_block
  end
end

#__subresource__Object

Resolves this builder to a subresource.



33
34
35
# File 'lib/cardiac/resource/builder.rb', line 33

def __subresource__
  @__subresource__ ||= Subresource.new(@base.to_resource)
end

#extending(*extensions, &extension_block) ⇒ Object



37
38
39
# File 'lib/cardiac/resource/builder.rb', line 37

def extending(*extensions,&extension_block)
  extend! extensions, &extension_block
end

#to_resourceObject

Returns a copy of our subresource.



15
16
17
# File 'lib/cardiac/resource/builder.rb', line 15

def to_resource
  __subresource__.dup
end