What you've stumbled on is the concept of public and private classes.
Public and private
classes are implemented very differently. A public class is your module's
entry point,
this is how people interact with your module. A public class is where you
define your
module's API. Private classes, on the other hand, are not meant to be
called outside your
module. Private classes are the meat of your module. This is where you will
actually
implement your module's functionality. A public class should be the only
way a user can
interact with your private classes. Public classes should generally do very
little. I
typically limit my public classes to validating the inputs received by my
parameters and
calling my private classes. Since examples speak louder than words, here's
an example:
# my_module/manifests/init.pp
class my_module (
$var1 = $my_module::params::var1,
$var2 = $my_module::params::var2,
$var3 = $my_module::params::var3,
) inherits my_module::params {
# Validate my parameters
validate_string($var1)
validate_array($var2)
validate_bool($var3)
# Call my 'private' classes
class { 'my_module::install': } ->
class {'my_module::config': } ~>
class {'my_module::service'} ->
Class['my_module']
}
The 'my_module' class is my public class. It has three parameters. All this
class does is
validate my three parameters and call my private classes. Let's take a look
at those
private classes:
# my_module/manifests/install.pp
class my_module::install (
$var1 = $my_module::var1,
$var2 = $my_module::var2,
) {
private()
# Body of the class
...
}
# my_module/manifests/config.pp
class my_module::config (
$var2 = $my_module::var2,
$var3 = $my_module::var3,
) {
private()
# Body of the class
...
}
# my_module/manifests/service.pp
class my_module::service (
$var1 = $my_module::var1,
$var2 = $my_module::var2,
$var3 = $my_module::var3,
) {
private()
# Body of the class
...
}
As you can see, I've marked my private classes with the private function.
This function
has not yet been released in stdlib, but is available in trunk
(https://github.com/puppetlabs/puppetlabs-stdlib#private). Google can show
you how
to implement this functionality in the DSL, if you prefer. The private
classes concept
allows us to make some assumptions that affect the design of this module,
specifically,
calling the variables in my_module without inheriting it first. We're
assuming that, since
this is a private class, it will not be called independently of my_module,
and those
variables will always be accessible.
This pattern can be found in a number of modules on the forge. Note, that
these modules
don't use the private function since it hasn't been released yet. They
assume that the
private classes are only being called inside their module. Here are some
examples:
https://github.com/garethr/garethr-docker
https://github.com/puppetlabs/puppetlabs-mysql
https://github.com/puppetlabs/puppetlabs-ntp
This is emerging very quickly as a good design pattern that fosters
modularity,
simplicity, good separation of concerns, and clear data flow.
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/95a01d6a-f6b0-48bd-b47b-bf9ab99773e0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.