Created
September 21, 2018 17:48
-
-
Save dividedharmony/5ff5040c4f55e04040bf920102a13f7a to your computer and use it in GitHub Desktop.
An abstract class to represent null objects
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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