class Naught::NullClassBuilder

Attributes

base_class[RW]
inspect_proc[RW]
interface_defined[RW]
interface_defined?[RW]

Public Class Methods

new() click to toggle source
# File lib/naught/null_class_builder.rb, line 13
def initialize
  @interface_defined = false
  @base_class        = Naught::BasicObject
  @inspect_proc      = lambda { '<null>' }
  @stub_strategy     = :stub_method_returning_nil
  define_basic_methods
end
Also aliased as: get

Private Class Methods

get()
Alias for: new

Public Instance Methods

black_hole() click to toggle source

Builder API

See also the contents of lib/naught/null_class_builder/commands

# File lib/naught/null_class_builder.rb, line 69
def black_hole
  @stub_strategy = :stub_method_returning_self
end
customization_module() click to toggle source
# File lib/naught/null_class_builder.rb, line 26
def customization_module
  @customization_module ||= Module.new
end
customize(&customization_block) click to toggle source
# File lib/naught/null_class_builder.rb, line 21
def customize(&customization_block)
  return unless customization_block
  customization_module.module_exec(self, &customization_block)
end
defer(options = {}, &deferred_operation) click to toggle source
# File lib/naught/null_class_builder.rb, line 85
def defer(options = {}, &deferred_operation)
  list = options[:class] ? class_operations : operations
  if options[:prepend]
    list.unshift(deferred_operation)
  else
    list << deferred_operation
  end
end
generate_class() click to toggle source
# File lib/naught/null_class_builder.rb, line 34
def generate_class # rubocop:disable AbcSize
  respond_to_any_message unless interface_defined?
  generation_mod    = Module.new
  customization_mod = customization_module # get a local binding
  builder           = self

  apply_operations(operations, generation_mod)

  null_class = Class.new(@base_class) do
    const_set :GeneratedMethods, generation_mod
    const_set :Customizations, customization_mod
    const_set :NULL_EQUIVS, builder.null_equivalents
    include Conversions
    remove_const :NULL_EQUIVS
    Conversions.instance_methods.each do |instance_method|
      undef_method(instance_method)
    end
    const_set :Conversions, Conversions

    include NullObjectTag
    include generation_mod
    include customization_mod
  end

  apply_operations(class_operations, null_class)

  null_class
end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/naught/null_class_builder.rb, line 98
def method_missing(method_name, *args, &block)
  command_name = command_name_for_method(method_name)
  if Commands.const_defined?(command_name)
    command_class = Commands.const_get(command_name)
    command_class.new(self, *args, &block).call
  else
    super
  end
end
null_equivalents() click to toggle source
# File lib/naught/null_class_builder.rb, line 30
def null_equivalents
  @null_equivalents ||= [nil]
end
respond_to?(*) click to toggle source
# File lib/naught/null_class_builder.rb, line 76
def respond_to?(*)
  true
end
respond_to_any_message() click to toggle source
# File lib/naught/null_class_builder.rb, line 73
def respond_to_any_message
  defer(:prepend => true) do |subject|
    subject.module_eval do
      def respond_to?(*)
        true
      end
    end
    stub_method(subject, :method_missing)
  end
  @interface_defined = true
end
respond_to_missing?(method_name, include_private = false) click to toggle source
# File lib/naught/null_class_builder.rb, line 109
def respond_to_missing?(method_name, include_private = false)
  respond_to_definition(method_name, include_private, :respond_to_missing?)
end
stub_method(subject, name) click to toggle source
# File lib/naught/null_class_builder.rb, line 94
def stub_method(subject, name)
  send(@stub_strategy, subject, name)
end

Private Instance Methods

apply_operations(operations, module_or_class) click to toggle source
# File lib/naught/null_class_builder.rb, line 137
def apply_operations(operations, module_or_class)
  operations.each do |operation|
    operation.call(module_or_class)
  end
end
class_operations() click to toggle source
# File lib/naught/null_class_builder.rb, line 165
def class_operations
  @class_operations ||= []
end
command_name_for_method(method_name) click to toggle source
# File lib/naught/null_class_builder.rb, line 185
def command_name_for_method(method_name)
  method_name.to_s.gsub(/(?:^|_)([a-z])/) { Regexp.last_match[1].upcase }
end
define_basic_class_methods() click to toggle source
# File lib/naught/null_class_builder.rb, line 153
def define_basic_class_methods
  defer(:class => true) do |subject|
    subject.module_eval do
      class << self
        alias_method :get, :new
      end
      klass = self
      define_method(:class) { klass }
    end
  end
end
define_basic_instance_methods() click to toggle source
# File lib/naught/null_class_builder.rb, line 143
def define_basic_instance_methods
  defer do |subject|
    subject.module_exec(@inspect_proc) do |inspect_proc|
      define_method(:inspect, &inspect_proc)
      def initialize(*)
      end
    end
  end
end
define_basic_methods() click to toggle source
# File lib/naught/null_class_builder.rb, line 132
def define_basic_methods
  define_basic_instance_methods
  define_basic_class_methods
end
operations() click to toggle source
# File lib/naught/null_class_builder.rb, line 169
def operations
  @operations ||= []
end
respond_to_definition(method_name, include_private, respond_to_method_name) click to toggle source
# File lib/naught/null_class_builder.rb, line 120
def respond_to_definition(method_name, include_private, respond_to_method_name)
  command_name = command_name_for_method(method_name)
  Commands.const_defined?(command_name) ||
    super_duper(respond_to_method_name, method_name, include_private)
rescue NameError
  super_duper(respond_to_method_name, method_name, include_private)
end
stub_method_returning_nil(subject, name) click to toggle source
# File lib/naught/null_class_builder.rb, line 173
def stub_method_returning_nil(subject, name)
  subject.module_eval do
    define_method(name) { |*| nil }
  end
end
stub_method_returning_self(subject, name) click to toggle source
# File lib/naught/null_class_builder.rb, line 179
def stub_method_returning_self(subject, name)
  subject.module_eval do
    define_method(name) { |*| self }
  end
end
super_duper(method_name, *args) click to toggle source
# File lib/naught/null_class_builder.rb, line 128
def super_duper(method_name, *args)
  self.class.superclass.send(method_name, *args)
end