lib/atome/genesis/genesis.rb in atome-0.5.4.1.9 vs lib/atome/genesis/genesis.rb in atome-0.5.5.6.4
- old
+ new
@@ -1,73 +1,170 @@
# frozen_string_literal: true
# allow to access Atome class using only a uniq atome
class Genesis
class << self
- def generator
- Atome.new
+
+ def create_particle(element, store, render)
+ Atome.define_method "set_#{element}" do |params, &user_proc|
+ particle_creation(element, params, store, render, &user_proc)
+ end
end
- end
-end
-# Genesis method here
-class Atome
- def build_particle(particle_name, options = {}, &particle_proc)
- type = options[:type]
- type = :string if options[:type].nil?
- store = options[:store]
- store = true if options[:store].nil?
- render = options[:render]
- render = true if options[:render].nil?
+ def build_particle(particle_name, options = {}, &particle_proc)
+ type = options[:type]
+ type = :string if options[:type].nil?
+ store = options[:store]
+ store = true if options[:store].nil?
+ render = options[:render]
+ render = true if options[:render].nil?
- # we add the new method to the particle's collection of methods
- Universe.add_to_particle_list(particle_name, type)
- # the line below create an empty particle method for each renderer, eg: browser_left, headless_width, ...
- # the line below create the corresponding particle method for Batch class
- particle_method_for_batch(particle_name)
- auto_render_generator(particle_name) if render
- new_particle(particle_name, store, render, &particle_proc)
- # the line below create all alternatives methods such as create 'method='
- additional_particle_methods(particle_name, store, render, &particle_proc)
- end
+ # we add the new method to the particle's collection of methods
+ Universe.add_to_particle_list(particle_name, type)
+ # the line below create an empty particle method for each renderer, eg: browser_left, headless_width, ...
+ # the line below create the corresponding particle method for Batch class
+ # particle_method_for_batch(particle_name)
+ auto_render_generator(particle_name) if render
+ new_particle(particle_name, store, render, &particle_proc)
+ # the line below create all alternatives methods such as create 'method='
+ additional_particle_methods(particle_name, store, render, &particle_proc)
+ end
- def build_atome(atome_name, &atome_proc)
- # TODO : atomes should tell the Universe if they're parts of materials category or else
- # we add the new method to the atome's collection of methods
- Universe.add_to_atome_list(atome_name)
- # the method below generate Atome method creation at Object level,
- # so a syntax like : 'text(:hello)' is possible instead of the mandatory : grab(:view).text(:hello)
- atome_method_for_object(atome_name)
- # the line below create the corresponding atome method for Batch class
- atome_method_for_batch(atome_name)
- unless Essentials.default_params[atome_name]
- # if it doesn't exist
- # we create default params for the new created atome, adding the hash to : module essential, @default_params
- Essentials.new_default_params(atome_name => { type: atome_name, attach: [:view] })
+ def build_atome(atome_name, &atome_proc)
+ # we add the new method to the atome's collection of methods
+ Universe.add_to_atome_list(atome_name)
+ # the method below generate Atome method creation at Object level,
+ # so a syntax like : 'text(:hello)' is possible instead of the mandatory : grab(:view).text(:hello)
+ atome_method_for_object(atome_name)
+ # the line below create the corresponding atome method for Batch class
+ # atome_method_for_batch(atome_name)
+ unless Essentials.default_params[atome_name]
+ # we create default params for the new created atome, adding the hash to : module essential, @default_params
+ # FIXME : the hash : attach: [:view] means that newly atome will systematically be attached to the wview instaed of the parent:
+ # ex : b.www will attach to view not b!
+ Essentials.new_default_params(atome_name => { type: atome_name })
+ end
+
+ # the line below create an empty atome method for each renderer, eg: browser_shape, headless_color, ...
+ auto_render_generator(atome_name)
+ new_atome(atome_name, &atome_proc)
+
end
- # the line below create an empty atome method for each renderer, eg: browser_shape, headless_color, ...
- auto_render_generator(atome_name)
- # create_atome(atome_name)
- new_atome(atome_name, &atome_proc)
+ def auto_render_generator(element)
+ Universe.renderer_list.each do |render_engine|
+ build_render("#{render_engine}_#{element}",)
+ end
+ end
- end
+ def build_render(renderer_name, &method_proc)
+ Atome.define_method renderer_name do |params = nil, &user_proc|
+ instance_exec(params, user_proc, &method_proc) if method_proc.is_a?(Proc)
+ end
+ end
- def auto_render_generator(element)
- Universe.renderer_list.each do |render_engine|
- build_render("#{render_engine}_#{element}")
+ def build_sanitizer(method_name, &method_proc)
+ Universe.add_sanitizer_method(method_name.to_sym, &method_proc)
end
- end
- def build_render(renderer_name, &method_proc)
- new_render_engine(renderer_name, &method_proc)
- end
+ def build_option(method_name, method_proc)
+ Universe.add_optional_method(method_name.to_sym, method_proc)
+ end
- def build_sanitizer(method_name, &method_proc)
- Universe.add_sanitizer_method(method_name.to_sym, &method_proc)
- end
+ def new_particle(element, store, render, &_method_proc)
+ Atome.define_method element do |params = nil, &user_proc|
+ @history[element] ||= []
+ if (params || params == false) && write_auth(element)
+ params = particle_sanitizer(element, params, &user_proc)
+ # the line below execute the main code when creating a new particle
+ # ex : new({ particle: :my_particle } do....
+ # instance_exec(params, user_proc, &method_proc) if method_proc.is_a?(Proc)
+ Genesis.create_particle(element, store, render)
+ # TODO: try to optimise and find a better way wo we can remove the condition below
+ if @type == :group && !%i[type id collect layout].include?(element)
+ collect.each do |collected_found|
+ grab(collected_found).send(element, params, &user_proc)
+ end
+ end
- def build_option(method_name, &method_proc)
- #puts "2 => #{method_name}"
- Universe.add_optional_method(method_name.to_sym, &method_proc)
+ computed_params= send("set_#{element}", params, &user_proc) # sent to : create_particle / Atome.define_method "set_#{element}"
+
+ # we historicize all write action below
+ # we add the changes to the stack that must be synchronised
+ Universe.historicize(@id, :write, element, params)
+ computed_params
+ elsif params || params == false
+ "send a valid password to write #{element} value"
+ elsif read_auth(element)
+ # particle getter below
+ value_found = instance_variable_get("@#{element}")
+ # uncomment below to historicize all read action
+ # Universe.historicize(@id, :read, element, value_found)
+ # we add the optional read plugin
+ value_found = particle_read(element, value_found, &user_proc)
+ value_found
+ # TODO : create a fast method to get particle: eg:
+ # Atome.define_method "set_#{element}" ... => send("set_#{element}"
+ else
+ "send a valid password to read #{element} value"
+ end
+
+ end
+ end
+
+ def additional_particle_methods(element, store, rendering, &method_proc)
+ # it allow the creation of method like top=, rotate=, ...
+ Atome.define_method "#{element}=" do |params = nil, &user_proc|
+ instance_exec(params, user_proc, &method_proc) if method_proc.is_a?(Proc)
+ params = particle_sanitizer(element, params)
+ particle_creation(element, params, store, rendering, &user_proc)
+ end
+ end
+
+ def new_atome(element, &method_proc)
+
+ # the method define below is the slowest but params are analysed and sanitized
+ Atome.define_method element do |params = nil, &user_proc|
+ instance_exec(params, user_proc, &method_proc) if method_proc.is_a?(Proc)
+ if params
+ params = atome_sanitizer(element, params, &user_proc)
+ atome_processor(element, params, &user_proc)
+ else
+ # when no params passed whe assume teh user want a getter,
+ # as getter should give us all atome of a given within the atome
+ # ex : puts a.shape => return all atome with the type 'shape' in this atome
+ collected_atomes = []
+ # attached.each do |attached_atome|
+ # collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
+ # end
+ # TODO : add category for atome( material/physical vs modifier : color, shadow, .. vs shape, image ..)
+ # then add condition same things fo code in presets/atome atome_common
+ if %i[color shadow paint].include?(element)
+ # we do the same for apply to be able to retrieve 'color' and other atome that apply instead of being attached
+ apply.each do |attached_atome|
+ collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
+ end
+ else
+ # collected_atomes = attached
+ attached.each do |attached_atome|
+ collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
+ end
+ end
+ collected_atomes
+ end
+ end
+
+ # the method define below is the fastest params are passed directly
+ Atome.define_method "set_#{element}" do |params, &user_proc|
+ # we generate the corresponding module here:
+ # Object.const_set(element, Module.new)
+ # we add the newly created atome to the list of "child in it's category, eg if it's a shape we add the new atome
+ # to the shape particles list : @!atome[:shape] << params[:id]
+ Atome.new(params, &user_proc)
+ # Now we return the newly created atome instead of the current atome that is the parent cf: b=box; c=b.circle
+ end
+
+ end
+
end
+
end