# Dynaload-0.2.0

**URL:** <https://www.ruby-forum.com/t/dynaload-0-2-0/99881>\
**Category:** Ruby\
**Created:** [December 13, 2005, 7:48am UTC](https://www.ruby-forum.com/t/dynaload-0-2-0/99881 "2005-12-13T07:48:27Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [December 13, 2005, 7:48am UTC](https://www.ruby-forum.com/t/dynaload-0-2-0/99881/1 "2005-12-13T07:48:27Z")

</div>

URIS  
[http://raa.ruby-lang.org/project/dynaload/](http://raa.ruby-lang.org/project/dynaload/)  
[http://www.codeforpeople.com/lib/ruby/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
