Package Variable Defaults
package Your::Point; use Badger::Class version => 2.718, debug => 0, base => 'Badger::Base', config => 'x|class:X y|class:Y', set_methods => 'x y', init_method => 'configure', throws => 'point'; our $X = 0; our $Y = 0;
Thus Spake Andy:
Here we've tweaked the
config option and changed our
config option gives you some flexibility in where it will go looking for
configuration values. You can tell it to look for default values in package variables
class:VARNAME), environment variables (
by calling other methods (
method:METHODNAME). The latter also includes
constant subroutines which you can call as class/object methods.
configure() method doesn't do any kind of validation - there
are plenty of fine modules already out there that will do that for you (which
we might plugin at some point). Rather, its primary purpose is to find the
most appropriate value for a variable which could be defined in one of several
places. In the above example, we tell it to look for the
x parameter in the
$config hash as before, but if that is undefined then to use the value
defined in the
X class variable. Which is a roundabout way of saying the
$X package variable.
However... and here's another science bit... there is a subtle but important
difference between package variables and class variables. If we had written
pkg:X instead of
class:X then we would have got the value in the
package variable (which we declare and define to be 0 down at the bottom there).
This would be true even if we create a subclass of
Your::Point - it will
always look at the
$Your::Point::X package variable for a default value
if one isn't explicitly defined in the object's configuration parameters.
However, when we define a class variable using
class:X then it will look
$X variable in the package of the subclass instead of the
Your::Point base class. If the package variable isn't defined in the
subclass then it will fall back on the value defined in the base class
(following the entire inheritance tree if necessary).