2007/11/25, Phrogz <phrogz / mac.com>:
> On Nov 25, 12:42 pm, Robert Klemme <shortcut... / googlemail.com> wrote:
> > On 25.11.2007 19:36, Phrogz wrote:
> >
> >
> >
> > > One of my libraries previously required code like this:
> >
> > >   # Convert markup to HTML, doing something
> > >   # useless with links and commands
> > >   owl = OWLScribble.new( markup )
> > >   owl.wiki_links.each{ |link|
> > >     # do something useful to the link
> > >   }
> > >   owl.wiki_commands.each{ |command|
> > >     # do something useful with the command
> > >   }
> > >   html = owl.to_html
> >
> > > I have changed it so that the user can instead describe how to handle
> > > links and commands in general, so that during initialization the
> > > library doesn't waste time or code lines doing something useless:
> >
> > >   owl = OWLScribble.new( markup ) do |owl|
> > >     owl.handle_wiki_link do |tag, page, link_text|
> > >       # do something useful to the link
> > >     end
> > >     owl.handle_wiki_command do |tag, command, params|
> > >       # do something useful to the command
> > >     end
> > >   end
> > >   puts owl.to_html
> >
> > > The syntax you see above is my current favorite choice for specifying
> > > these two procs. Alternatives that I have rejected as less elegant:
> >
> > >   # Deferred initialization
> > >   owl = OWLScribble.new( markup )
> > >   owl.handle_wiki_link{ ... }
> > >   owl.handle_wiki_command{ ... }
> > >   owl.run
> > >   puts owl.to_html
> >
> > >   # proc params
> > >   do_link = proc{ ... }
> > >   do_command = proc{ ... }
> > >   owl = OWLScribble.new(
> > >     markup,
> > >     :handle_wiki_link=>do_link,
> > >     :handle_wiki_command=>do_command
> > >   )
> > >   puts owl.to_html
> >
> > > Can anyone suggest a more elegant way of supplying multiple processing
> > > procs that should be used during initialization, on a per-instance
> > > basis?
> >
> > Why not just
> >
> >    owl = OWLScribble.new(
> >      markup,
> >      :handle_wiki_link => lambda {...},
> >      :handle_wiki_command => lambda {...}
> >    )
>
> I personally lump that in with the other option that happens to create
> the procs outside the function call. As you show it, with a single
> ellipsis for each proc's content, it feels clean. I expect
> handle_wiki_link to be on the order of 20 lines, and
> handle_wiki_command to take 50-100 lines. That seems excessive to
> inline into a method call.

Good point.  I did not know that they would become that complex.  In
that case it's a reasonable option to define them elsewhere.  But in
that case I'd probably even define them as constants - unless you need
the local binding.

Kind regards

robert

-- 
use.inject do |as, often| as.you_can - without end