Issue #2957 has been reported by Luke Kanies.

----------------------------------------
Feature #2957: Classes should support an 'extends' functionality
http://projects.reductivelabs.com/issues/2957

Author: Luke Kanies
Status: Accepted
Priority: Normal
Assigned to: 
Category: language
Target version: Rowlf
Affected version: 0.25.1
Keywords: 
Branch: 


Current inheritance behaviour doesn't cover enough functionality.  It's quite 
often that people want to override things other than resources in a subclass, 
but it doesn't work.  E.g.:
<pre>
class base {
  $var = foo
  file { "/m": content => $var }
}
class sub inherits base {
  $var = other
}
</pre>
This doesn't work for two reasons:  First, because the resource is created with 
the base class's value before the sub class sets its variable.  This will be 
fixed in #2596.  Second, the base and subclass have separate scopes, so the 
resource defined in the base class knows absolutely nothing about the 
subclass's variable.

I propose we add a new kind of class relationship, called 'extension'.  It's 
very similar to inheritance (and likely will entirely replace it at some 
point), except that the entire class hierarchy shares a single scope.  Thus, in 
the above code, the subclass's $var setting would actually replace the base 
class's setting.

This behaviour would require that all things that affect scope -- variable 
setting, defaults, and maybe more -- would need to retain source information, 
like resource parameters do, so we could meet the same inheritance rules we 
have now.  For instance, the following should be an error:
<pre>
class base {
  $var = foo
  file { "/m": content => $var }
}
class sub1 extends base {
  $var = other
}
class sub2 extends base {
  $var = yay
}
include sub1, sub2
</pre>
But this would not:
<pre>
class base {
  $var = foo
  file { "/m": content => $var }
}
class sub1 extends base {
  $var = other
}
class sub2 extends sub1 {
  $var = yay
}
include sub1, sub2
</pre>
This works because sub2 is a child of sub1, rather than a peer, so it can 
override its parent.

It's currently unresolved whether extension and inheritance can be used in the 
same class hierarchy.  Instinctively, it seems like they could, but I think 
that would be pretty confusing.


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://reductivelabs.com/redmine/my/account

--

You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" 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/puppet-bugs?hl=en.


Reply via email to