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 <[email protected]>
>>
>> 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
> [email protected]
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel