On Dec 26 2011, 7:56 am, Trevor Vaughan <tvaug...@onyxpoint.com>
wrote:
> I just ran into an interesting scenario where I didn't know how to
> scope my variables and I'd just like to share for the crowd.
>
> Suppose you have two modules 'foo' and 'bar'. You also have two
> defines, 'foo::do_stuff' and 'bar::more_stuff'.
>
> define foo::do_stuff (
>   $var1 = 'a',
>   $var2 = 'b'
> ) {
>   bar::more_stuff { 'test': }
>
> }
>
> define bar::more_stuff (
>   $optional_var = 'ignore'
> ) {
>   file { '/tmp/test':
>     content => template('bar/random.erb')
>
> }
>
> +++ random.erb +++
>
> var1 = <%= var1 %>
> var2 = <%= var2 %>
>
> So, here, puppet complains about the scope of var1 and var2 but what
> should the correct scope be? foo::do_stuff::var1, etc...? But how does
> that work with multiple define calls to foo::do_stuff?
>
> This, of course, can be avoided by putting the template under
> foo/templates and forcing the passage of content to bar::more_stuff
> but I'm not quite sure *why* this isn't supposed to work and what to
> do about it with the notice that 2.8 will force the scoping of all
> variables.


Definitions are not equivalent to macros.  Among other things, the
variables a definition declares are not added to the scope from which
it is instantiated, which is to say that definition instances
establish their own variable scopes.

Templates resolve variables from the scope in which the template()
function is called.  The var1 and var2 are not local to that scope in
your example (see above), and that's why you get a scope warning.

Or did you mean you don't understand why dynamic scoping is being
removed?  The basic reason seems to be that those making such
decisions judged that it causes more problems than it solves, and that
there was nothing that could be done with dynamic scoping that could
not also be done by other means.  Indeed, I am convinced that a
significant reason for the introduction of parameterized classes was
to make that so.

As for you current case, I think the best solution is indeed to add
var1 and var2 as parameters to bar::more_stuff.  They are de facto
parameters anyway, by virtue of the template's (dynamic) use of them,
so putting them in the parameter list makes things clearer (and thus
more maintainable).  It also gives you more freedom in how you use the
definition.  In other words, there is plenty of upside.


John



>
> Thanks,
>
> Trevor
>
> --
> Trevor Vaughan
> Vice President, Onyx Point, Inc
> (410) 541-6699
> tvaug...@onyxpoint.com
>
> -- This account not approved for unencrypted proprietary information --

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to