That actually breaks... k ends up with a two element key/value array and 
v ends up with nil. Also, inject takes the return value of the last 
block as the memo value for the next block, so you'd have to do

@scope_object.extend(@options[:locals].inject(Module.new) { |m, k| 
m.send(:define_method, k[0]) { k[1] }; m })

As to the messiness of the codebase, I think to some extent it's 
inevitable. As we add more features, write more stuff to handle edge 
cases, etc. it's not always possible to keep it elegant. Not to mention 
that, as humans, we tend to make stupid mistakes from time to time (like 
this one... heh).

As part of the 2.0 release, I'm planning to do some serious reworking of 
the Engine/Buffer rendering system. This is primarily to increase 
efficiency by making as much rendering as possible happen before the 
template is cached, but it'll also offer a good opportunity to take a 
good look at the code that's currently doing the rendering and clean it 
up as much as possible.

That's not to say that it wouldn't be worthwhile to do some cleaning 
now, though. If you're interested, by all means go for it.

- Nathan

Nick Howell wrote:
> Or, if you want an uber-one-liner:
>
> @scope_object.send(:extend, @options[:locals].inject(Module.new) { |m,
> k, v| m.send(:define_method, k) { v } })
>
> Is it just me, or could Haml use some code-cleanup?
>
> Nick
>
> On Apr 12, 6:34 pm, "Nathan Weizenbaum" <[EMAIL PROTECTED]> wrote:
>   
>> You're right, it should be like that. I don't know how it snuck through.
>> I'll fix it later today.
>>
>> - Nathan
>>
>> On 4/12/07, Nick Howell <[EMAIL PROTECTED]> wrote:
>>
>>
>>
>>     
>>> In Haml::Engine#render:
>>> <pre>
>>> 176     def render(scope = Object.new, &block)
>>> 177       @scope_object = scope
>>> 178       @buffer = Haml::Buffer.new(@options)
>>> 179
>>> 180       local_assigns = @options[:locals]
>>> 181
>>> 182       # Get inside the view object's world
>>> 183       @scope_object.instance_eval do
>>> 184         # Set all the local assigns
>>> 185         local_assigns.each do |key,val|
>>> 186           self.class.send(:define_method, key) { val }
>>> 187         end
>>> 188       end
>>> </pre>
>>>       
>>> Notice that scope and @scope_object are, by default, Objects. When
>>> local_assigns are...assigned...the Object class has new methods
>>> defined on it. This is *bad*.
>>>       
>>> I suggest that we replace it with this:
>>> <pre>
>>> m = Module.new
>>> locals_assigns.each { |k, v| m.send(:define_method, k) { m } }
>>> @scope_object.send(:extend, m)
>>> </pre>
>>>       
>>> Thoughts?
>>>       
>>> Nick
>>>       
>
>
> >
>
>   


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Haml" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/haml?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to