Dynaload-0.2.0


#1

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