URIS
http://raa.ruby-lang.org/project/dynaload/
http://www.codeforpeople.com/lib/ruby/dynaload/
NAME
dynaload.rb
DESCRIPTION
a simple toolset to make dynamic loading of classes and modules
easier
imagine you have many files containing the following kinds of class
definitions
class ClassName
def method
end
end
you’d like to be able to dynamically load the file defining a class,
instantiate the class(es) defined in it, and and run ClassName#method
on an
instance WITHOUT knowing beforhand which class will be loaded.
dyanload
solves this problem. classes wishing to be dyanloaded do the
following
----------------
file: 1.rb
----------------
require 'dynaload'
class ClassOne
def answer
42
end
end
Dynaload::export ClassOne, 'answer' => true
----------------
file: 2.rb
----------------
require 'dynaload'
class ClassTwo
def answer
42
end
end
Dynaload::export ClassTwo, 'answer' => true
the options hash (‘answer’ => true) may contain anything deemed
useful and is
entirely dedicated for user data
now both files can be dynaloaded, the classes instantiated, and
methods called
with
require 'dynaload'
%w( 1.rb 2.rb ).each do |file|
loaded = Dynaload::dynaload file
klasses = loaded.select{|klass, attributes| attributes['answer']
== true}
klasses.each do |klass, attributes|
object = klass::new
p object.answer
end
end
any class or module defined in a file can be exported and is then
available
via the Dynaload interface. for instance:
class C
module M
class B
Dynaload::export B
end
end
end
Dynaload::export C
is valid and exports only the classes C and B - not C::M.
the concept works best with modules as the exported quantities and
loading
within an anonymous wrapper module (the default) to protect the
namespace.
eg.
----------------
file: 1.rb
----------------
require 'dynaload'
module FooJob
def run
...
end
end
Dynaload::export FooJob
----------------
file: 2.rb
----------------
require 'dynaload'
module BarJob
def run
...
end
end
Dynaload::export BarJob
loading is done (by default) in an anonymous module so neither
FooJob or
BarJob is introduced into the caller’s namespace:
require 'dynaload'
loaded = Dynaload::dynaload('1.rb') | Dynaload::dynaload('2.rb')
modules = loaded.modules
# here neither FooJob or BarJob are polluting namespace
SAMPLES/DOCS
see samples/*
CAVEATS
this software is experimental and quite simple
enjoy.
-a