class FelFlame::Cmp

Creates component managers and allows accessing them them under the {FelFlame::Components} namespace as Constants

To see how component managers are used please look at the {FelFlame::ComponentManager} documentation.

Public Class Methods

each(&block) click to toggle source

Iterate over all existing component managers. You also call other enumerable methods instead of each, such as each_with_index or select @return [Enumerator]

# File lib/felflame/component_manager.rb, line 51
def each(&block)
  constants.each(&block)
end
new(component_name, *attrs, **attrs_with_defaults) click to toggle source

Creates a new {FelFlame::ComponentManager component manager}.

@example

# Here color is set to default to red
# while max and current are nil until set.
# When you make a new component using this component manager
# these are the values and accessors it will have.
FelFlame::Component.new('Health', :max, :current, color: 'red')

@param component_name [String] Name of your new component manager. Must be stylized in the format of constants in Ruby @param attrs [:Symbols] New components made with this manager will include these symbols as accessors, the values of these accessors will default to nil @param attrs_with_defaults [Keyword: DefaultValue] New components made with this manager will include these keywords as accessors, their defaults set to the values given to the keywords @return [ComponentManager]

# File lib/felflame/component_manager.rb, line 19
def new(component_name, *attrs, **attrs_with_defaults)
  if FelFlame::Components.const_defined?(component_name)
    raise(NameError.new, "Component Manager '#{component_name}' is already defined")
  end


  const_set(component_name, Class.new(FelFlame::ComponentManager) {})

  attrs.each do |attr|
    if FelFlame::Components.const_get(component_name).method_defined?("#{attr}") || FelFlame::Components.const_get(component_name).method_defined?("#{attr}=")
      raise NameError.new "The attribute name \"#{attr}\" is already a method"
    end
    FelFlame::Components.const_get(component_name).attr_accessor attr
  end
  attrs_with_defaults.each do |attr, _default|
    attrs_with_defaults[attr] = _default.dup
    FelFlame::Components.const_get(component_name).attr_reader attr
    FelFlame::Components.const_get(component_name).define_method("#{attr}=") do |value|
      attr_changed_trigger_systems(attr) unless value.equal? send(attr)
      instance_variable_set("@#{attr}", value)
    end
  end
  FelFlame::Components.const_get(component_name).define_method(:set_defaults) do
    attrs_with_defaults.each do |attr, default|
      instance_variable_set("@#{attr}", default.dup)
    end
  end
  FelFlame::Components.const_get(component_name)
end