module_creation_helper 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,13 @@
1
+ *SVN*
2
+
3
+ *0.0.3* (September 18th, 2007)
4
+
5
+ * Convert dos newlines to unix newlines
6
+
7
+ *0.0.2* (February 2nd, 2007)
8
+
9
+ * Released as a gem
10
+
11
+ *0.0.1* (January 4th, 2007)
12
+
13
+ * Initial release
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2005-2006 Aaron Pfeifer & Neil Abraham
1
+ Copyright (c) 2006-2007 Aaron Pfeifer & Neil Abraham
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README CHANGED
@@ -1,17 +1,21 @@
1
1
  = module_creation_helper
2
2
 
3
- module_creation_helper adds a helper method for creating new modules and classes
3
+ +module_creation_helper+ adds a helper method for creating new modules and classes
4
4
  at runtime.
5
5
 
6
6
  == Resources
7
7
 
8
+ API
9
+
10
+ * http://api.pluginaweek.org/module_creation_helper
11
+
8
12
  Wiki
9
13
 
10
14
  * http://wiki.pluginaweek.org/Module_creation_helper
11
15
 
12
16
  Announcement
13
17
 
14
- * http://www.pluginaweek.org/2007/01/04/10-from-anonymous-to-named-and-back-again-a-tale-of-modules-and-classes/
18
+ * http://www.pluginaweek.org/2007/01/04/10-from-anonymous-to-named-and-back-again-a-tale-of-modules-and-classes
15
19
 
16
20
  Source
17
21
 
@@ -24,11 +28,10 @@ Development
24
28
  == Description
25
29
 
26
30
  Creating modules and classes at runtime isn't the easiest and most intuitive
27
- process that Ruby could have provided. Although often used for anonymous
28
- classes, there are many times where you will want to associate a runtime class
29
- with an actual name.
31
+ process. Although often used for anonymous classes, there are many times where
32
+ you will want to associate a runtime class with an actual name.
30
33
 
31
- Normally, you would create new classes and associate them with a name like so:
34
+ Traditionally, you would create new classes like so:
32
35
 
33
36
  >> c = Class.new
34
37
  => #<Class:0x480e388>
@@ -36,10 +39,9 @@ Normally, you would create new classes and associate them with a name like so:
36
39
  => Foo
37
40
 
38
41
  Although this isn't very hard, there are two problems:
39
- (1) It's a repetitive process that should be DRYed in the same way that chaining
40
- methods has been dried.
41
- (2) Callbacks that are invoked while the class is being created do not have
42
- access to the name of the class.
42
+ (1) It's a repetitive process that should be DRYed.
43
+ (2) Callbacks that are invoked while the class is being created do not know the
44
+ name of the class.
43
45
 
44
46
  To understand the second problem, consider the following:
45
47
 
@@ -59,14 +61,13 @@ example,
59
61
  As you can see from output in this example, since the class has not yet been
60
62
  assigned to a constant, it is anonymous and does not yet have a name.
61
63
 
62
- To address these two issues, the functionality is encapsulated into a new method,
63
- Module#create. Since the method is defined in Module, it is also available to
64
+ To address these issues, the functionality is encapsulated into a new method,
65
+ <tt>Module#create</tt>. Since the method is defined in Module, it is also available to
64
66
  Class since Class inherits from Module.
65
67
 
66
- Rather than defining new modules/classes using Module#new/Class#new, this plugin
67
- uses class_eval on the object's parent. This allows names to be immediately
68
- associated with the class/module regardless of whether it is currently being
69
- evaluated or has already been evaluated.
68
+ == Usage
69
+
70
+ === Creating new classes/modules
70
71
 
71
72
  Using the same example as before,
72
73
 
@@ -75,16 +76,21 @@ Using the same example as before,
75
76
  => Bar
76
77
 
77
78
  As you can see, the name of the class is now available during the +inherited+
78
- callback and is automatically assigned to the 'Bar' constant in Object. In
79
- addition to specifying the superclass, you can also specify the parent
79
+ callback and is automatically assigned to the 'Bar' constant in Object.
80
+
81
+ === Specifying the parent class/module
82
+
83
+ In addition to specifying the superclass, you can also specify the parent
80
84
  module/class like so:
81
85
 
82
86
  >> c = Class.create('Bar', :superclass => Foo, :parent => MyModule)
83
87
  inherited class: MyModule::Bar, name: MyModule::Bar
84
88
  => MyModule::Bar
85
89
 
86
- Finally, as you normally could when creating a new class, you can provide an
87
- additional block that defines the body of the class. For example,
90
+ === Defining class/module methods
91
+
92
+ As you normally could when creating a new class, you can provide an additional
93
+ block that defines the body of the class. For example,
88
94
 
89
95
  >> c = Class.create('Bar', :superclass => Foo, :parent => MyModule) do
90
96
  ?> def say_hello
@@ -94,4 +100,8 @@ additional block that defines the body of the class. For example,
94
100
  inherited class: MyModule::Bar, name: MyModule::Bar
95
101
  => Bar
96
102
  >> Bar.new.say_hello
97
- => "hello"
103
+ => "hello"
104
+
105
+ == Dependencies
106
+
107
+ This plugin does not depend on the presence of any other plugins.
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require 'rake/gempackagetask'
4
4
  require 'rake/contrib/sshpublisher'
5
5
 
6
6
  PKG_NAME = 'module_creation_helper'
7
- PKG_VERSION = '0.0.2'
7
+ PKG_VERSION = '0.0.3'
8
8
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
9
9
  RUBY_FORGE_PROJECT = 'pluginaweek'
10
10
 
@@ -33,13 +33,13 @@ spec = Gem::Specification.new do |s|
33
33
  s.platform = Gem::Platform::RUBY
34
34
  s.summary = 'Adds a helper method for creating new modules and classes at runtime.'
35
35
 
36
- s.files = FileList['{lib,tasks,test}/**/*'].to_a + %w(init.rb MIT-LICENSE Rakefile README)
36
+ s.files = FileList['{lib,test}/**/*'].to_a + %w(CHANGELOG init.rb MIT-LICENSE Rakefile README)
37
37
  s.require_path = 'lib'
38
38
  s.autorequire = 'module_creation_helper'
39
39
  s.has_rdoc = true
40
40
  s.test_files = Dir['test/**/*_test.rb']
41
41
 
42
- s.author = 'Aaron Pfeifer and Neil Abraham'
42
+ s.author = 'Aaron Pfeifer, Neil Abraham'
43
43
  s.email = 'info@pluginaweek.org'
44
44
  s.homepage = 'http://www.pluginaweek.org'
45
45
  end
@@ -76,4 +76,4 @@ task :release => [:gem, :package] do
76
76
 
77
77
  ruby_forge.add_release(RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, file)
78
78
  end
79
- end
79
+ end
@@ -1,64 +1,64 @@
1
- module PluginAWeek #:nodoc:
2
- module CoreExtensions #:nodoc:
3
- module Module #:nodoc:
4
- module ModuleCreationHelper
5
- # Creates a new module with the specified name. This is essentially the
6
- # same as actually defining the module like so:
7
- #
8
- # module NewModule
9
- # end
10
- #
11
- # or as a class:
12
- #
13
- # class NewClass < SuperKlass
14
- # end
15
- #
16
- # Configuration options:
17
- # <tt>superclass</tt> - The class to inherit from. This only applies when using Class#create. Default is Object.
18
- # <tt>parent</tt> - The class/module that contains this module. Default is Object.
19
- #
20
- # Examples:
21
- #
22
- # Module.create('Foo') # => Foo
23
- # Module.create('Bar', :parent => Foo) # => Foo::Bar
24
- # Class.create('Waddle') # => Waddle
25
- # Class.create('Widdle', :parent => Waddle) # => Waddle::Widdle
26
- # Class.create('Woddle', :superclass => Waddle::Widdle, :parent => Waddle) # => Waddle::Woddle
27
- # Waddle::Woddle.superclass # => Waddle::Widdle
28
- def create(name, options = {}, &block)
29
- options.assert_valid_keys(
30
- :superclass,
31
- :parent
32
- )
33
- raise ArgumentError, 'Modules cannot have superclasses' if options[:superclass] && self.to_s == 'Module'
34
-
35
- options.reverse_merge!(
36
- :superclass => ::Object,
37
- :parent => ::Object
38
- )
39
- parent = options[:parent]
40
- superclass = options[:superclass]
41
-
42
- if superclass != ::Object
43
- superclass = " < ::#{superclass}"
44
- else
45
- superclass = ''
46
- end
47
-
48
- parent.class_eval <<-end_eval
49
- #{self.to_s.downcase} #{name}#{superclass}
50
- end
51
- end_eval
52
-
53
- mod = parent.const_get(name)
54
- mod.class_eval(&block) if block_given?
55
- mod
56
- end
57
- end
58
- end
59
- end
60
- end
61
-
62
- class ::Module #:nodoc:
63
- extend PluginAWeek::CoreExtensions::Module::ModuleCreationHelper
64
- end
1
+ module PluginAWeek #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Module #:nodoc:
4
+ module ModuleCreationHelper
5
+ # Creates a new module with the specified name. This is essentially the
6
+ # same as actually defining the module like so:
7
+ #
8
+ # module NewModule
9
+ # end
10
+ #
11
+ # or as a class:
12
+ #
13
+ # class NewClass < SuperKlass
14
+ # end
15
+ #
16
+ # Configuration options:
17
+ # <tt>superclass</tt> - The class to inherit from. This only applies when using Class#create. Default is Object.
18
+ # <tt>parent</tt> - The class/module that contains this module. Default is Object.
19
+ #
20
+ # Examples:
21
+ #
22
+ # Module.create('Foo') # => Foo
23
+ # Module.create('Bar', :parent => Foo) # => Foo::Bar
24
+ # Class.create('Waddle') # => Waddle
25
+ # Class.create('Widdle', :parent => Waddle) # => Waddle::Widdle
26
+ # Class.create('Woddle', :superclass => Waddle::Widdle, :parent => Waddle) # => Waddle::Woddle
27
+ # Waddle::Woddle.superclass # => Waddle::Widdle
28
+ def create(name, options = {}, &block)
29
+ options.assert_valid_keys(
30
+ :superclass,
31
+ :parent
32
+ )
33
+ raise ArgumentError, 'Modules cannot have superclasses' if options[:superclass] && self.to_s == 'Module'
34
+
35
+ options.reverse_merge!(
36
+ :superclass => ::Object,
37
+ :parent => ::Object
38
+ )
39
+ parent = options[:parent]
40
+ superclass = options[:superclass]
41
+
42
+ if superclass != ::Object
43
+ superclass = " < ::#{superclass}"
44
+ else
45
+ superclass = ''
46
+ end
47
+
48
+ parent.class_eval <<-end_eval
49
+ #{self.to_s.downcase} #{name}#{superclass}
50
+ end
51
+ end_eval
52
+
53
+ mod = parent.const_get(name)
54
+ mod.class_eval(&block) if block_given?
55
+ mod
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ ::Module.class_eval do
63
+ extend PluginAWeek::CoreExtensions::Module::ModuleCreationHelper
64
+ end
data/test/test_helper.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'test/unit'
2
- require 'rubygems'
3
- require 'active_support'
4
-
5
- $:.unshift(File.dirname(__FILE__) + '/../lib')
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'active_support'
4
+
5
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
6
6
  require File.dirname(__FILE__) + '/../init'
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: module_creation_helper
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.2
7
- date: 2007-02-02 00:00:00 -05:00
6
+ version: 0.0.3
7
+ date: 2007-09-18 00:00:00 -04:00
8
8
  summary: Adds a helper method for creating new modules and classes at runtime.
9
9
  require_paths:
10
10
  - lib
@@ -27,11 +27,12 @@ signing_key:
27
27
  cert_chain:
28
28
  post_install_message:
29
29
  authors:
30
- - Aaron Pfeifer and Neil Abraham
30
+ - Aaron Pfeifer, Neil Abraham
31
31
  files:
32
32
  - lib/module_creation_helper.rb
33
33
  - test/test_helper.rb
34
34
  - test/module_creation_helper_test.rb
35
+ - CHANGELOG
35
36
  - init.rb
36
37
  - MIT-LICENSE
37
38
  - Rakefile