Module: Such::Parts
- Defined in:
- lib/such/parts.rb
Class Method Summary collapse
-
.make(part, thing, *plugs) ⇒ Object
Such::Parts ### Signature: Such::Parts.make(partSymbol, thingSuch::Thing, plugsArray(Symbol)) \ (Such::Thing+Such::Part) The name of the Such::Part sub-class will be part.
Class Method Details
.make(part, thing, *plugs) ⇒ Object
Such::Parts ### Signature:
Such::Parts.make(part\Symbol, thing\Such::Thing, plugs\Array(Symbol)) \
(Such::Thing+Such::Part)
The name of the Such::Part sub-class will be part. It will be a sub-class of thing(a sub-class of Such::Thing). The Array of symbols, plugs, will be accessors to other connected Such::Part’s. Each plug must match:
/^<Part config key!>_<Name of connected sub-classed super-class>$/
Note that these plugs are ‘attr_accessor`s,. Exemplar:
Component0#initialize(...,&block_given)
...
part_obj.key_Component1 = Component1.new(:key!,&block_given)
...
Note that all connected components share the same block_given:
block_given(part\Such::Part, *w, signal\String)
It gets called when the part receives its assigned activation signal, like “clicked” for a Button.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/such/parts.rb', line 22 def self.make(part, thing, *plugs) unless thing < Such::Thing and [part,*plugs].all?{_1.is_a? Symbol} raise "Expected Such::Parts.make(Symbol part, " + "Class thing < Such::Thing, *Symbol plugs)" end plugs.each do |plug| if /^[^\W_]+_(?<super_class>[^\W_]+)$/=~plug next unless $VERBOSE unless Object.const_defined?("Such::#{super_class}") $stderr.puts "Warning: Such::#{super_class} not defined yet." end else raise "Plugs must have the form key_class: #{plug}" end end sub_class = Such.subclass(part, thing, include: Such::Part, attr_accessor: plugs) sub_class.singleton_class.class_eval{ define_method(:plugs){plugs} } return sub_class end |