concord-0.1.6/0000755000004100000410000000000013760412170013176 5ustar www-datawww-dataconcord-0.1.6/lib/0000755000004100000410000000000013760412170013744 5ustar www-datawww-dataconcord-0.1.6/lib/concord.rb0000644000004100000410000000441313760412170015722 0ustar www-datawww-datarequire 'adamantium' require 'equalizer' # A mixin to define a composition class Concord < Module include Adamantium::Flat, Equalizer.new(:names) # The maximum number of objects the hosting class is composed of MAX_NR_OF_OBJECTS = 3 # Return names # # @return [Enumerable] # # @api private # attr_reader :names private # Initialize object # # @return [undefined] # # @api private # def initialize(*names) if names.length > MAX_NR_OF_OBJECTS fail "Composition of more than #{MAX_NR_OF_OBJECTS} objects is not allowed" end @names, @module = names, Module.new define_initialize define_readers define_equalizer end # Hook run when module is included # # @return [undefined] # # @api private # def included(descendant) descendant.send(:include, @module) end # Define equalizer # # @return [undefined] # # @api private # def define_equalizer @module.send(:include, Equalizer.new(*@names)) end # Define readers # # @return [undefined] # # @api private # def define_readers attribute_names = names @module.class_eval do attr_reader(*attribute_names) protected(*attribute_names) end end # Define initialize method # # @return [undefined] # # @api private # # rubocop:disable MethodLength # def define_initialize ivars, size = instance_variable_names, names.size @module.class_eval do define_method :initialize do |*args| args_size = args.size if args_size != size fail ArgumentError, "wrong number of arguments (#{args_size} for #{size})" end ivars.zip(args) { |ivar, arg| instance_variable_set(ivar, arg) } end private :initialize end end # Return instance variable names # # @return [String] # # @api private # def instance_variable_names names.map { |name| "@#{name}" } end # Mixin for public attribute readers class Public < self # Hook called when module is included # # @param [Class,Module] descendant # # @return [undefined] # # @api private # def included(descendant) super @names.each do |name| descendant.send(:public, name) end end end # Public end # Concord concord-0.1.6/concord.gemspec0000644000004100000410000000316213760412170016174 0ustar www-datawww-data######################################################### # This file has been automatically generated by gem2tgz # ######################################################### # -*- encoding: utf-8 -*- # stub: concord 0.1.6 ruby lib Gem::Specification.new do |s| s.name = "concord".freeze s.version = "0.1.6" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["Markus Schirp".freeze] s.date = "2020-09-10" s.description = "Helper for object composition".freeze s.email = ["mbj@schirp-dso.com".freeze] s.files = ["lib/concord.rb".freeze] s.homepage = "https://github.com/mbj/concord".freeze s.licenses = ["MIT".freeze] s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) s.rubygems_version = "2.5.2.1".freeze s.summary = "Helper for object composition".freeze if s.respond_to? :specification_version then s.specification_version = 4 if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q.freeze, ["~> 0.2.0"]) s.add_development_dependency(%q.freeze, ["~> 0.1.26"]) s.add_runtime_dependency(%q.freeze, ["~> 0.0.9"]) else s.add_dependency(%q.freeze, ["~> 0.2.0"]) s.add_dependency(%q.freeze, ["~> 0.1.26"]) s.add_dependency(%q.freeze, ["~> 0.0.9"]) end else s.add_dependency(%q.freeze, ["~> 0.2.0"]) s.add_dependency(%q.freeze, ["~> 0.1.26"]) s.add_dependency(%q.freeze, ["~> 0.0.9"]) end end