Hi! What you can do is a "factory" just like this: module OpenDirectory class Node < ODNode def self.create(config = { :node_name => "/Local/Default" }) if config[:node_name].eql? "/Local/Default" session = ODSession.defaultSession else session = ODSession.sessionWithOptions config[:session_options], error:nil end return self.nodeWithSession session, name:config[:node_name], error:nil end def initWithSession(session, name:name, error:err) if super @session = session self end end end end And then call: local_node = OpenDirectory::Node.create remote_node = OpenDirectory::Node.create proxy_config And then you can pass these nodes directly to the OD methods :-) You can also do a more Cocoa-ish way: def self.nodeWithConfig(config) config ||= { :node_name => "/Local/Default" } if config[:node_name].eql? "/Local/Default" session = ODSession.defaultSession else session = ODSession.sessionWithOptions config[:session_options], error:nil end return self.nodeWithSession session, name:config[:node_name], error:nil end Then you can OpenDirectory::Node.nodeWithConfig(nil) or OpenDirectory::Node.nodeWithConfig(proxy_config). You could even just call OpenDirectory::Node.nodeWithConfig(config), whether it's a proxy config or nothing :-) Hope that helps! -- Thibault Martin-Lagardette On May 5, 2010, at 00:49, russell muetzelfeldt wrote:
From: Thibault Martin-Lagardette <thibault.ml@gmail.com>
Hi!
I believe the problem is that you were overriding the wrong init method. Here is what I changed to your code to make it work:
class MyNode < ODNode def initWithSession(session, name:name, error:err) if super @session = session self end end end
session = ODSession.defaultSession node = MyNode.nodeWithSession session, name: "/Local/Default", error: nil
I override initWithSession:name:error instead of init, and created a "MyNode" object the exact same way I would have created an ODNode :-) The results were, I believe, what you would expect:
Thanks, but unfortunately that doesn't actually help - there's no difference in use between that and not wrapping the object init... For example, what I'm doing currently is this -
module OpenDirectory class Node attr_reader :node def initialize config = { :node_name => "/Local/Default" } if config[:node_name].eql? "/Local/Default" @session = ODSession.defaultSession else @session = ODSession.sessionWithOptions config[:session_options], error:nil end @node = ODNode.nodeWithSession @session, name:config[:node_name], error:nil end end end
so I can either
local_node = OpenDirectory::Node.new
or
remote_node = OpenDirectory::Node.new proxy_config
where proxy_config is a hash containing info for a DS remote connection to our directory master. I then access the ODNode as either local_node.node or remote_node.node where required. What I want to be able to do is just use local_node or remote_node as if they were ODNode objects (or subclasses of ODNode) to remove the ruby proxying wrapper around the core Obj-C objects, but still hide the ugliness of OpenDirectory behind some simpler Model style wrappers.
(I hope that makes sense)
cheers
Russell
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel