class InstallError < RuntimeError; end def create_placeholder(*functions) # create_placeholder: create a placeholder for functions that will be used by crew later functions.each do |func_name| define_singleton_method(func_name) { true } end end def property(*properties) # property: like attr_accessor, but `=` is not needed to define a value # Examples: # {prop_name}('example') # set {prop_name} to 'example' # {prop_name} # return the value of {prop_name} properties.each do |prop_name| define_singleton_method(prop_name) do |prop_value = nil, &block| prop_var_name = "@#{prop_name}" if block # store the block if a block is provided instance_variable_set(prop_var_name, block) elsif prop_value instance_variable_set(prop_var_name, prop_value) else # return current value if nothing is provided return instance_variable_get(prop_var_name) end end end end def boolean_property(*boolean_properties) # boolean_property: if this exists in a package, it will return true # Examples: # {prop_name} # this will return #{prop_name} as true define_singleton_method(:available_boolean_properties) do # available_boolean_properties: Return all available boolean properties for use in commands/{prop,help}.rb # Usage: # puts Package.available_boolean_properties => [:conflicts_ok, ...] return boolean_properties end boolean_properties.each do |prop_name| prop_var_name = "@#{prop_name}" # Adds the self.{symbol} method define_singleton_method(prop_name) do instance_variable_set(prop_var_name, true) end # Adds the self.{symbol}? method define_singleton_method("#{prop_name}?") do return !!instance_variable_get(prop_var_name) end end end