[Nitro] Og: Patch: Manage propertywise empty classes

Aleksi Niemela Aleksi.Niemela at cs.helsinki.fi
Sun Jun 19 06:39:06 EDT 2005

Code like

    class Preference
      # This class is just a placeholder, therefore empty.
      # It's managed, however and needs some keyword to be noticed as such.
    #  property :name, String  
      managed   # without this keyword, there would be no method primary_key
    class User
      # This class is not empty in a sense it will have associations to
      # another class, but at this point it doesn't contain any properties.
      # Therefore has_many needs to be defined all the time,
      # not only after first property definition.
    #  property :name, String
      has_many :preferences, :Preference

doesn't work currently because

1) User doesn't call property and doesn't get enchanted (with 
RelationMixins), therefore call to has_many doesn't succeed.
2) Neither class gets managed as they don't declare @__props, and if 
they did it would be empty.
3) It's not possible to explicitly declare class to be managed even if 
it's empty.

The patch has two parts. First we have to add "stub methods" to 
bootstrap real meta mixins (and relation mixins) and keyword "managed". 
This could be accomplished along the lines of following first patch. 
Please note you have to at least complete the list of methods which will 
bootstrap enchanting.

The second patch completes the functionality by altering finding of 
classes to manage not to require them to be not empty.  I just added 
comment marker, but I believe the rest of the line should be deleted. 
(Also the patch might not work as I've already altered manager.rb for 
other purposes, but I'm sure you got the idea.)

    - Aleksi

$ diff -u ../../../glue-0.18.1/lib/glue/property.rb~ 
--- ../../../glue-0.18.1/lib/glue/property.rb~  2005-06-13 
23:53:15.894375000 +0300
+++ ../../../glue-0.18.1/lib/glue/property.rb   2005-06-19 
13:30:01.343750000 +0300
@@ -385,7 +385,24 @@
        alias_method :property, :prop_accessor
+  # Bootstrapping meta mixins from their respective keywords
+  # and forwarding call to real method.
+  ['has_many', 'belongs_to' #, ...
+  ].each do |meta_mixin_name|
+    module_eval %{
+      def #{meta_mixin_name}(*params)
+        Glue::PropertyUtils.enchant(self)
+        Glue::PropertyUtils.include_meta_mixins(self)
+        #{meta_mixin_name}(*params)
+      end
+    }
+  end

+  def managed
+    Glue::PropertyUtils.include_meta_mixins(self)
+  end
        # Attach metadata.
        # Guard against duplicates, no need to keep order.
        # This method uses closures :)

$ diff -u manager.rb~ manager.rb
--- manager.rb~ 2005-06-13 23:54:27.535000000 +0300
+++ manager.rb  2005-06-19 13:07:12.890625000 +0300
@@ -122,7 +123,7 @@
                classes = []

                ObjectSpace.each_object(Class) do |c|
-                       if c.respond_to?(:__props) and (!c.__props.empty?)
+                       if c.respond_to?(:__props) # and (!c.__props.empty?)
                                classes << c

More information about the Nitro-general mailing list