On Fri, 4 Aug 2017 15:23:21 +0200
hw <[email protected]> wrote:
> Now I´m confused as to what is a module and a package. Both are
> files.
>
> In any case, it is my intention to keep everything that one class
> requires within one file which starts with 'package FOO'. Due to
> increasing complexity, I´m using POD sections or I wouldn´t know
> anymore what I´m doing ...
>
A package is a name space. A file may have more than one package:
package Foo;
# thingies for Foo
package Bar;
# thingies for Bar
package main;
# thingies for main (default package)
__END__
In Perl, a class is a thingy blessed to a package. In other words,
classes are subset of packages but a package need not be a class.
package Foo;
$object = bless $thingy, Foo;
__END__
A module is a file which has the extension `*.pm` It can be loaded by
the `use` keyword.
use Foo; # load the module Foo.pm
__END__
As seen above, a module need not be restricted to one package. In fact,
the module need not have the package for its name.
# File: Foo.pm
package Bar;
# thingies for Bar
__END__
And a module can have one (or more) class(es).
# File: Foo.pm
package Foo;
sub new {
return bless { @_ };
}
__END__
Packages may be distributed among many files.
# File: Foo.pm
package Foo;
# thingies for Foo
__END__
# File: Bar.pm
package Foo;
# more thingies for Foo
__END__
This is very confusing so the convention is that one module has one
package. I'm telling you this because the terms module and package are
not interchangeable.
To summarize:
* A module is a file with the extension *.pm
* A module may have zero, one or many packages but please stick to one
package per module.
* Packages may be distributed among many files but please stick to one
module for each package.
* A package may be a class. If it has the keyword `bless`in it, it is a
class.
> > The way I would do it would be to separate out what is common in
> > both Foo and Bar and put them in a separate module. Then Foo and
> > Bar can `use` it as their parent.
>
> I think that might be the best solution. I could make a metaclass
> that contains the methods common to both FOO and BAR and have both of
> them descend from it.
>
> However, that feels like using inheritance in an upside down manner.
> But perhaps it´s supposed to be used like that?
Yes, they are called virtual classes. Aka generics in Java and
interfaces in general.
http://www.cs.utah.edu/~germain/PPS/Topics/interfaces.html
--
Don't stop where the ink does.
Shawn H Corey
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/