module Dry::Core::ClassAttributes

def defines(*args)

OtherClass.two # => 'two'
OtherClass.one # => 1

MyClass.two # => 2
MyClass.one # => 1

end
two 'two'
class OtherClass < MyClass

end
two 2
one 1

defines :one, :two

extend Dry::Core::ClassAttributes
class MyClass
@example

Specify what attributes a class will use
def defines(*args)
  mod = Module.new do
    args.each do |name|
      define_method(name) do |value = Undefined|
        ivar = "@#{name}"
        if value == Undefined
          if instance_variable_defined?(ivar)
            instance_variable_get(ivar)
          else
            nil
          end
        else
          instance_variable_set(ivar, value)
        end
      end
    end
    define_method(:inherited) do |klass|
      args.each { |name| klass.public_send(name, send(name)) }
      super(klass)
    end
  end
  extend(mod)
end