initializer 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/initializer/initializer.rb +32 -0
- data/lib/initializer/macro.rb +174 -0
- data/lib/initializer/parameter.rb +11 -0
- data/lib/initializer.rb +4 -0
- metadata +48 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
module Initializer
|
2
|
+
def self.included(base)
|
3
|
+
base.extend ClassMethods
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def initializer_macro(*parameters)
|
10
|
+
Macro.generate_definitions self, parameters
|
11
|
+
end
|
12
|
+
alias :initializer :initializer_macro
|
13
|
+
|
14
|
+
def r(parameter_name)
|
15
|
+
return Parameter.new(parameter_name, :reader)
|
16
|
+
end
|
17
|
+
|
18
|
+
def w(parameter_name)
|
19
|
+
return Parameter.new(parameter_name, :writer)
|
20
|
+
end
|
21
|
+
|
22
|
+
def a(parameter_name)
|
23
|
+
return Parameter.new(parameter_name, :accessor)
|
24
|
+
end
|
25
|
+
alias :rw :a
|
26
|
+
|
27
|
+
def na(parameter_name)
|
28
|
+
return Parameter.new(parameter_name, :no_accessor)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module Initializer
|
2
|
+
class Macro
|
3
|
+
DEFAULT_VISIBILITY = :reader
|
4
|
+
|
5
|
+
attr_reader :target_class
|
6
|
+
attr_reader :parameters
|
7
|
+
|
8
|
+
def initialize(target_class, parameters)
|
9
|
+
@target_class = target_class
|
10
|
+
@parameters = parameters
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.build(target_class, parameters)
|
14
|
+
parameters, options = separate_parameters(parameters)
|
15
|
+
options.extend InitializerOptions
|
16
|
+
parameters = NormalizeParameters.normalize(parameters, options.visibility)
|
17
|
+
instance = new target_class, parameters
|
18
|
+
instance
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.generate_definitions(target_class, parameters)
|
22
|
+
instance = build target_class, parameters
|
23
|
+
instance.generate_definitions
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.separate_parameters(parameters)
|
27
|
+
options = { :default => DEFAULT_VISIBILITY }
|
28
|
+
options = parameters.pop if options?(parameters)
|
29
|
+
|
30
|
+
return parameters, options
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.options?(parameters)
|
34
|
+
parameters.last.is_a? Hash
|
35
|
+
end
|
36
|
+
|
37
|
+
def generate_definitions
|
38
|
+
define_attributes
|
39
|
+
InitializerDefinition.define_initializer(target_class, parameters)
|
40
|
+
end
|
41
|
+
|
42
|
+
def define_attributes
|
43
|
+
parameters.each do |p|
|
44
|
+
Attribute.define target_class, p.name, p.visibility
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class InitializerDefinition
|
49
|
+
attr_reader :target_class
|
50
|
+
attr_reader :parameters
|
51
|
+
|
52
|
+
def initialize(target_class, parameters)
|
53
|
+
@target_class = target_class
|
54
|
+
@parameters = parameters
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.define_initializer(target_class, parameters)
|
58
|
+
parameters = parameters.map do |parameter|
|
59
|
+
parameter.extend InitializerParameter
|
60
|
+
end
|
61
|
+
instance = new target_class, parameters
|
62
|
+
instance.define_initializer
|
63
|
+
end
|
64
|
+
|
65
|
+
def define_initializer
|
66
|
+
body = build_initializer_definition
|
67
|
+
target_class.class_eval body
|
68
|
+
end
|
69
|
+
|
70
|
+
def variable_assignment_statements
|
71
|
+
variable_assignments = parameters.inject("") do|assignments, parameter|
|
72
|
+
"#{assignments}#{parameter.assignment_statement}\n"
|
73
|
+
end
|
74
|
+
variable_assignments
|
75
|
+
end
|
76
|
+
|
77
|
+
def parameter_names
|
78
|
+
parameter_names = parameters.map{|item| item.name }.to_a
|
79
|
+
parameter_names = parameter_names.join(", ")
|
80
|
+
parameter_names
|
81
|
+
end
|
82
|
+
|
83
|
+
def build_initializer_definition
|
84
|
+
body =
|
85
|
+
<<CTOR
|
86
|
+
def initialize(#{parameter_names})
|
87
|
+
#{variable_assignment_statements}
|
88
|
+
end
|
89
|
+
CTOR
|
90
|
+
end
|
91
|
+
|
92
|
+
module InitializerParameter
|
93
|
+
def variable_name
|
94
|
+
"@#{name}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def assignment_statement
|
98
|
+
"#{variable_name} = #{name}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
module InitializerOptions
|
104
|
+
def visibility
|
105
|
+
self[:default]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class Attribute
|
110
|
+
attr_reader :target_class
|
111
|
+
attr_reader :name
|
112
|
+
attr_reader :visibility
|
113
|
+
|
114
|
+
def initialize(target_class, name, visibility)
|
115
|
+
@target_class = target_class
|
116
|
+
@name = name
|
117
|
+
@visibility = visibility
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.define(target_class, name, visibility)
|
121
|
+
instance = new target_class, name, visibility
|
122
|
+
instance.define
|
123
|
+
end
|
124
|
+
|
125
|
+
def define
|
126
|
+
define_getter if [:reader, :accessor].include? visibility
|
127
|
+
define_setter if [:writer, :accessor].include? visibility
|
128
|
+
end
|
129
|
+
|
130
|
+
def define_getter
|
131
|
+
name = self.name
|
132
|
+
target_class.send :define_method, name do
|
133
|
+
instance_variable_get("@#{name}")
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def define_setter
|
138
|
+
name = self.name
|
139
|
+
target_class.send :define_method, "#{name}=" do |value|
|
140
|
+
instance_variable_set("@#{name}", value)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
class NormalizeParameters
|
146
|
+
attr_reader :parameters
|
147
|
+
attr_reader :default_visibility
|
148
|
+
|
149
|
+
def initialize(parameters, default_visibility)
|
150
|
+
@parameters = parameters
|
151
|
+
@default_visibility = default_visibility
|
152
|
+
end
|
153
|
+
|
154
|
+
def self.normalize(parameters, default_visibility)
|
155
|
+
instance = new parameters, default_visibility
|
156
|
+
instance.normalize
|
157
|
+
instance.parameters
|
158
|
+
end
|
159
|
+
|
160
|
+
def normalize
|
161
|
+
@parameters = parameters.map do |p|
|
162
|
+
normalize_parameter p
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def normalize_parameter(parameter)
|
167
|
+
if parameter.is_a? Symbol
|
168
|
+
return Parameter.new parameter, default_visibility
|
169
|
+
else
|
170
|
+
return parameter
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
data/lib/initializer.rb
ADDED
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: initializer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- The Sans Collective
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-21 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email:
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/initializer/initializer.rb
|
21
|
+
- lib/initializer/macro.rb
|
22
|
+
- lib/initializer/parameter.rb
|
23
|
+
- lib/initializer.rb
|
24
|
+
homepage: https://github.com/Sans/initializer
|
25
|
+
licenses: []
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 1.9.2
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 1.8.25
|
45
|
+
signing_key:
|
46
|
+
specification_version: 3
|
47
|
+
summary: Initializer Library
|
48
|
+
test_files: []
|