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
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