class Virtus::Builder

Class to build a Virtus module with it's own config

This allows for individual Virtus modules to be included in classes and not impacted by the global Virtus config, which is implemented using Virtus.config.

@private

Attributes

config[R]

Return config

@return [config]

@api private

mod[R]

Return module

@return [Module]

@api private

Public Class Methods

call(options, &block) click to toggle source

@api private

# File lib/virtus/builder.rb, line 27
def self.call(options, &block)
  new(Configuration.new(options, &block)).mod
end
new(conf, mod = Module.new) click to toggle source

Initializes a new Builder

@param [Configuration] config @param [Module] mod

@return [undefined]

@api private

# File lib/virtus/builder.rb, line 44
def initialize(conf, mod = Module.new)
  @config, @mod = conf, mod
  add_included_hook
  add_extended_hook
end
pending() click to toggle source

@api private

# File lib/virtus/builder.rb, line 32
def self.pending
  @pending ||= []
end

Public Instance Methods

extensions() click to toggle source

@api private

# File lib/virtus/builder.rb, line 51
def extensions
  [Model::Core]
end
options() click to toggle source

@api private

# File lib/virtus/builder.rb, line 56
def options
  config.to_h
end

Private Instance Methods

add_extended_hook() click to toggle source

@api private

# File lib/virtus/builder.rb, line 79
def add_extended_hook
  with_hook_context do |context|
    mod.define_singleton_method :extended do |object|
      context.modules.each { |mod| object.extend(mod) }
      object.define_singleton_method(:attribute, context.attribute_method)
    end
  end
end
add_included_hook() click to toggle source

Adds the .included hook to the anonymous module which then defines the .attribute method to override the default.

@return [Module]

@api private

# File lib/virtus/builder.rb, line 68
def add_included_hook
  with_hook_context do |context|
    mod.define_singleton_method :included do |object|
      Builder.pending << object unless context.finalize?
      context.modules.each { |mod| object.send(:include, mod) }
      object.define_singleton_method(:attribute, context.attribute_method)
    end
  end
end
with_hook_context() { |hook_context| ... } click to toggle source

@api private

# File lib/virtus/builder.rb, line 89
def with_hook_context
  yield(HookContext.new(self, config))
end