hash_struct 0.1 → 0.2

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/README.textile CHANGED
@@ -10,3 +10,23 @@ h1. Usage
10
10
  User = HashStruct.new(:first_name, :last_name)
11
11
  @user = User.new(first_name: "Jakub", last_name: "Stastny")
12
12
  </pre>
13
+
14
+ h1. Inheritance
15
+
16
+ <pre>
17
+ module TestMixin
18
+ def say_hi() puts("Hi!") end
19
+ end
20
+
21
+ HashStruct.extend(TestMixin)
22
+ User = HashStruct.new(:first_name, :last_name)
23
+ User.say_hi
24
+ # => "Hi!"
25
+ </pre>
26
+
27
+ <pre>
28
+ HashStruct.send(:include, TestMixin)
29
+ User = HashStruct.new(:first_name, :last_name)
30
+ User.new.say_hi
31
+ # => "Hi!"
32
+ </pre>
data/lib/hash_struct.rb CHANGED
@@ -5,6 +5,10 @@ class HashStruct
5
5
  # @user = User.new(first_name: "Jakub", last_name: "Stastny")
6
6
  def self.new(*attributes)
7
7
  raise ArgumentError, "you have to specify some attributes" if attributes.empty?
8
+
9
+ included = self.included_modules
10
+ extended = (class << self; self; end).included_modules
11
+
8
12
  Class.new do
9
13
  # setup accessors
10
14
  attributes.each do |attribute|
@@ -17,6 +21,20 @@ class HashStruct
17
21
  self.send("#{attribute}=", value)
18
22
  end
19
23
  end
24
+
25
+ # NOTE: second possible implementation (maybe better) is Class.new(self)
26
+ # but then we have to used the original new method, so the object will be properly created
27
+ # include modules
28
+ (included - self.included_modules).each do |mixin|
29
+ puts "Including #{mixin}"
30
+ self.send(:include, mixin)
31
+ end
32
+
33
+ # extended modules
34
+ (extended - (class << self; self; end).included_modules).each do |mixin|
35
+ puts "Extending #{mixin}"
36
+ self.extend(mixin)
37
+ end
20
38
  end
21
39
  end
22
40
  end
@@ -29,4 +29,23 @@ describe HashStruct do
29
29
  instance.first_name.should eql("Jakub")
30
30
  end
31
31
  end
32
+
33
+ describe "inheritance" do
34
+ before(:each) do
35
+ @hs = Class.new(HashStruct)
36
+ @mixin = Module.new { def say_hi() end }
37
+ end
38
+
39
+ it "should inherit all mixins of HashStruct" do
40
+ @hs.send(:include, @mixin)
41
+ @struct = @hs.new(:first_name, :last_name)
42
+ @struct.instance_methods.should include(:say_hi)
43
+ end
44
+
45
+ it "should be extended by all mixins of HashStruct" do
46
+ @hs.extend(@mixin)
47
+ @struct = @hs.new(:first_name, :last_name)
48
+ @struct.methods.should include(:say_hi)
49
+ end
50
+ end
32
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.1"
4
+ version: "0.2"
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Jakub \xC5\xA0\xC5\xA5astn\xC3\xBD aka Botanicus"