1 2 3 4 5 6 7 8 9 10 11 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
module Tins
# Implementation of the null object pattern in Ruby.
module Null
def method_missing(*)
self
end
def const_missing(*)
self
end
def to_s
''
end
def to_str
nil
end
def to_f
0.0
end
def to_i
0
end
def to_int
nil
end
def to_a
[]
end
def to_ary
nil
end
def inspect
'NULL'
end
def nil?
true
end
def blank?
true
end
def as_json(*)
end
def to_json(*)
'null'
end
module Kernel
def null(value = nil)
value.nil? ? Tins::NULL : value
end
alias Null null
def null_plus(opts = {})
value = opts[:value]
opts[:caller] = caller
if respond_to?(:caller_locations, true)
opts[:caller_locations] = caller_locations
end
value.nil? ? Tins::NullPlus.new(opts) : value
end
alias NullPlus null_plus
end
end
class NullClass < Module
include Tins::Null
end
NULL = NullClass.new
NULL.freeze
class NullPlus
include Tins::Null
def initialize(opts = {})
singleton_class.class_eval do
opts.each do |name, value|
define_method(name) { value }
end
end
end
end
end
require 'tins/alias'
|