Skip to content

Instantly share code, notes, and snippets.

@dividedharmony
Created September 21, 2018 17:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dividedharmony/5ff5040c4f55e04040bf920102a13f7a to your computer and use it in GitHub Desktop.
Save dividedharmony/5ff5040c4f55e04040bf920102a13f7a to your computer and use it in GitHub Desktop.
An abstract class to represent null objects
# frozen_string_literal: true
class NullObject
class << self
SOFT_DEFAULTS = {
array: [],
hash: {},
null: nil
null_object: NullObject
}.freeze
def attr_with_soft_default(method_name, soft_default)
define_method method_name do
soft_default_value(soft_default)
end
end
private
def soft_default_value(soft_default)
if soft_default <= NullObject
soft_default.new
else
SOFT_DEFAULTS.fetch(soft_default)
end
end
end
end
## example subclass
class NullProduct < NullObject
attr_with_soft_default :variants, :array
attr_with_soft_default :available_on, :null
attr_with_soft_default :fragrance, NullFragrance
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment