lib/mvcli/loader.rb in mvcli-0.0.16 vs lib/mvcli/loader.rb in mvcli-0.1.0

- old
+ new

@@ -1,11 +1,55 @@ require "active_support/inflector/methods" module MVCLI class Loader - include ActiveSupport::Inflector + def initialize(extensions = {}) + @extensions = Map extensions + @default_handler = RubyClassLoader.new + end + def load(type, name, *args, &block) constantize(camelize("#{name}_#{type}")).new(*args, &block) + end + + def exists?(path, extension_type, name) + pathname = handler(extension_type).to_path name, extension_type + path.exists? pathname + end + + def read(path, extension_type, name, namespace = Object) + pathname = handler(extension_type).to_path name, extension_type + bytes = path.read pathname + handler(extension_type).define name, bytes, extension_type, namespace + end + + private + + def handler(extension_type) + @extensions[extension_type] || @default_handler + end + + class RubyClassLoader + include ActiveSupport::Inflector + + def to_path(name, extension_type) + "#{pluralize extension_type}/#{name}_#{extension_type}.rb" + end + + def define(name, bytes, extension_type, namespace) + eval bytes, TOPLEVEL_BINDING, to_path(name, extension_type), 1 + components = [namespace.name, classify("#{name}_#{extension_type}")] + components.shift if namespace == Object + lookup components.join('::'), to_path(name, extension_type) + end + + private + + def lookup(class_name, filename) + constantize class_name + rescue NameError + fail LoadError, "expected #{filename} to define #{class_name}" + end end end end