lib/konstructor/factory.rb in konstructor-0.2.0 vs lib/konstructor/factory.rb in konstructor-0.3.0
- old
+ new
@@ -27,13 +27,13 @@
name = name.to_sym
if @next_method_is_konstructor
@next_method_is_konstructor = false
@konstructor_names << name
- define(name)
+ process_declaration(name)
elsif declared?(name)
- define(name)
+ process_declaration(name)
end
end
private
@@ -56,45 +56,58 @@
def process_new_names(new_names)
new_names = new_names.map(&:to_sym)
@konstructor_names.concat(new_names)
new_names.each do |name|
- if has_own_method?(name)
- define(name)
+ if method_in_hierarchy?(name)
+ process_declaration(name)
else
- # not sure if konstructor ever will be defined,
- # but informing about the problem anyway
- validate_name(name)
+ # not sure if method will ever be defined,
+ # but validating its name anyway
+ validate_name!(name)
end
end
end
- def has_own_method?(name)
- method_defined = @klass.method_defined?(name) || @klass.private_method_defined?(name)
- superclass_method_defined = @klass.respond_to?(:superclass) && (
- @klass.superclass.method_defined?(name) || @klass.superclass.private_method_defined?(name)
- )
- method_defined && !superclass_method_defined
+ def method_in_hierarchy?(name)
+ method_defined?(@klass, name)
end
+ def method_on_superclass?(name)
+ @klass.respond_to?(:superclass) && method_defined?(@klass.superclass, name)
+ end
+
+ def method_defined?(klass, name)
+ klass.method_defined?(name) || klass.private_method_defined?(name)
+ end
+
# this method is idempotent
- def define(name)
- validate_name(name)
+ def process_declaration(name)
+ validate_name!(name)
- # defining class method
+ if method_on_superclass?(name) && !declared_in_superclass?(name)
+ raise DeclaringInheritedError, name
+ end
+
+ define_factory(name)
+ mark_as_private(name)
+ end
+
+ def define_factory(name)
@klass.instance_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{name}(*args, &block)
instance = allocate
instance.__send__(:#{name}, *args, &block)
instance
end
RUBY
+ end
- # marking instance method as private
+ def mark_as_private(name)
@klass.__send__(:private, name)
end
- def validate_name(name)
+ def validate_name!(name)
if Konstructor.reserved?(name)
raise ReservedNameError, name
end
end
end
\ No newline at end of file